본문 바로가기
2023/PROJECT

[JAVA] 캘린더 UI (클래스 정리)

by Or0i쿠 2023. 6. 22.
적용 전 테스트  클래스÷ 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