적용 전 테스트 클래스÷ ver.

메인
더보기
package clendar;
import javax.swing.*;
public class CalendarApp {
public static void main(String[] args) {
new CalendarApp().start();
}
public void start() {
JFrame frame = new JFrame("Calendar");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
BackgroundImagePanel container = new BackgroundImagePanel("C:\\Users\\karin\\Desktop\\JAVA.DB\\main.png");
container.setLayout(null);
frame.setContentPane(container);
CalendarPanel calendarContainer = new CalendarPanel();
container.add(calendarContainer);
frame.setSize(480, 680);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
이미지 창
더보기
package clendar;
import java.awt.*;
import javax.swing.*;
public class BackgroundImagePanel extends JPanel {
private ImageIcon backgroundImage;
public BackgroundImagePanel(String imagePath) {
backgroundImage = new ImageIcon(imagePath);
setLayout(null);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage.getImage(), 0, 0, this);
}
}
캘린더 UI
더보기
package clendar;
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class CalendarPanel extends JPanel {
private JLabel dateLabel;
public CalendarPanel() {
setLayout(new BorderLayout());
setOpaque(false);
setBounds(21, 76, 425, 358);
JPanel headerPanel = new JPanel(new BorderLayout());
headerPanel.setOpaque(false);
add(headerPanel, BorderLayout.NORTH);
dateLabel = new JLabel(" "+getDateString(new Date()));
dateLabel.setHorizontalAlignment(SwingConstants.LEFT);
dateLabel.setVerticalAlignment(SwingConstants.CENTER);
// 날짜 레이블의 폰트를 NEXON Lv1 Gothic 25px로 변경
dateLabel.setFont(new Font("NEXON Lv1 Gothic", Font.BOLD, 25));
headerPanel.add(dateLabel, BorderLayout.CENTER);
// 여백을 위한 패딩 추가, 위에 5px 추가
headerPanel.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
JPanel calendarPanel = new JPanel(new BorderLayout());
calendarPanel.setOpaque(false);
add(calendarPanel, BorderLayout.CENTER);
JPanel weekPanel = new JPanel(new GridLayout(0, 7));
weekPanel.setOpaque(false);
calendarPanel.add(weekPanel, BorderLayout.NORTH);
weekPanel.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0));
String[] weekdays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
for (String weekday : weekdays) {
JLabel label = new JLabel(weekday);
label.setHorizontalAlignment(SwingConstants.CENTER);
// 요일 레이블의 폰트를 NEXON Lv1 Gothic으로 변경
label.setFont(new Font("NEXON Lv1 Gothic", Font.BOLD, 12));
weekPanel.add(label);
}
JPanel daysPanel = new JPanel(new GridLayout(0, 7));
daysPanel.setOpaque(false);
calendarPanel.add(daysPanel, BorderLayout.CENTER);
Calendar calendar = Calendar.getInstance();
renderMonth(daysPanel, calendar);
add(createButtonPanel(daysPanel, calendar), BorderLayout.SOUTH);
}
private String getDateString(Date date) {
DateFormat dateFormat = new SimpleDateFormat("yyyy MMMM");
return dateFormat.format(date);
}
private void renderMonth(JPanel daysPanel, Calendar calendar) {
calendar.set(Calendar.DAY_OF_MONTH, 1);
int startingDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = 1; i < startingDayOfWeek; i++) {
daysPanel.add(new JLabel(""));
}
for (int day = 1; day <= daysInMonth; day++) {
JLabel dayLabel = new JLabel(String.valueOf(day));
dayLabel.setHorizontalAlignment(SwingConstants.CENTER);
dayLabel.setVerticalAlignment(SwingConstants.CENTER);
// 일수 레이블의 폰트를 NEXON Lv1 Gothic으로 변경
dayLabel.setFont(new Font("NEXON Lv1 Gothic", Font.PLAIN, 12));
daysPanel.add(dayLabel);
}
}
private JPanel createButtonPanel(final JPanel daysPanel, final Calendar calendar) {
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); // 가운데 정렬로 변경
buttonPanel.setOpaque(false);
final JButton prevMonthButton = new JButton("<");
prevMonthButton.addActionListener(e -> {
calendar.add(Calendar.MONTH, -1);
daysPanel.removeAll();
renderMonth(daysPanel, calendar);
dateLabel.setText(" "+getDateString(calendar.getTime()));
buttonPanel.revalidate();
buttonPanel.repaint();
});
// 버튼의 배경 투명하게 만들기
prevMonthButton.setOpaque(false);
prevMonthButton.setContentAreaFilled(false);
prevMonthButton.setBorderPainted(false);
// 이전 달 버튼의 폰트를 NEXON Lv1 Gothic으로 변경
prevMonthButton.setFont(new Font("NEXON Lv1 Gothic", Font.BOLD, 12));
buttonPanel.add(prevMonthButton);
final JButton nextMonthButton = new JButton(">");
nextMonthButton.addActionListener(e -> {
calendar.add(Calendar.MONTH, 1);
daysPanel.removeAll();
renderMonth(daysPanel, calendar);
dateLabel.setText(" "+getDateString(calendar.getTime()));
buttonPanel.revalidate();
buttonPanel.repaint();
});
// 버튼의 배경 투명하게 만들기
nextMonthButton.setOpaque(false);
nextMonthButton.setContentAreaFilled(false);
nextMonthButton.setBorderPainted(false);
// 다음 달 버튼의 폰트를 NEXON Lv1 Gothic으로 변경
nextMonthButton.setFont(new Font("NEXON Lv1 Gothic", Font.BOLD, 12));
buttonPanel.add(nextMonthButton);
return buttonPanel;
}
}
'2023 > PROJECT' 카테고리의 다른 글
| [SPL] 관계형 데이터베이스 (0) | 2023.06.27 |
|---|---|
| [JAVA]SWING (0) | 2023.06.23 |
| [JAVA] 검색창 (0) | 2023.06.21 |
| [JAVA] 캘린더 UI (0) | 2023.06.20 |
| [JAVA] 오라클 일정 추가 캘린더 (0) | 2023.06.20 |