도라에몽주머니

[Java/Eclipse] Java 54일차 본문

Study/Java

[Java/Eclipse] Java 54일차

에몽쓰 2022. 12. 1. 16:32

Java

 

Calender

: 날짜와 시간을 처리하는 추상 클래스

 

예제

: 아래와 같은 만년달력을 만드는 코드를 작성하시오.

만년달력

// Exam28.java
package calendar;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Exam28 extends JFrame implements ActionListener{
	Container container = this.getContentPane();
	
	// North
	JPanel panelNorth = new JPanel();
	JButton buttonBefore = new JButton("Before");
	JButton buttonAfter = new JButton("After");
	JLabel label = new JLabel("Date");
	
	// Center
	JPanel panelCenter = new JPanel();
	JButton[] buttons = new JButton[49];
	String[] dayNames = {"일","월","화","수","목","금","토"};
	
	// 날짜 관리 클래스
	HCalendar hCalendar = new HCalendar(buttons);
	
	public Exam28() {
		// frame 기본 설정
		this.setTitle("만년달력");
		this.setSize(550, 400);
		this.setLocation(500, 300);
		this.setResizable(false);  // 크기 변경 금지
		
		init();
		start();
		
		this.setVisible(true);
	}
	// 화면구성
	private void init() {
		/* frame 구성 */
		container.setLayout(new BorderLayout());
		container.add("North", panelNorth);
		container.add("Center", panelCenter);
		
		/* panelNorth 구성 */ 
		panelNorth.setLayout(new FlowLayout());
		panelNorth.add(buttonBefore);
		panelNorth.add(label);
		panelNorth.add(buttonAfter);
		
		// 버튼과 라벨의 글자 설정
		Font font1 = new Font("Sans Serif", Font.BOLD, 20);
		buttonAfter.setFont(font1);
		buttonBefore.setFont(font1);
		label.setFont(font1);
		
		// 라벨에 년월 출력
		label.setText(hCalendar.getCalText());
		
		/* panelCenter 구성 */ 		
		panelCenter.setLayout(new GridLayout(7, 7, 5, 5));
		Font font2 = new Font("Serif", Font.BOLD, 24);
		
		for(int i=0; i<buttons.length; i++) {
			buttons[i] = new JButton();
			panelCenter.add(buttons[i]);
			
			// 버튼 폰트 설정
			buttons[i].setFont(font2);
			buttons[i].setBackground(Color.WHITE);
			
			// buttons[0]~buttons[6]에 일~토 글씨 넣기
			if(i<7) {
				buttons[i].setText(dayNames[i]);
			}
			
			// 버튼색 설정, 일요일 : 빨간색, 토요일 : 파란색
			if(i%7 == 0) {  // 일요일 버튼
				buttons[i].setForeground(Color.RED);
			}
			if(i%7 == 6) {  // 토요일 버튼
				buttons[i].setForeground(Color.BLUE);
			}
		}
		// 날짜 출력
		hCalendar.calSet();
	}
	// 이벤트 설정
	private void start() {
		// x버튼 이벤트 처리
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		buttonAfter.addActionListener(this);
		buttonBefore.addActionListener(this);
	}

	// 이벤트 처리
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource() == buttonBefore) {
			hCalendar.allInit(-1);
			// label에 날짜 출력
			label.setText(hCalendar.getCalText());
		} else if(e.getSource() == buttonAfter) {
			hCalendar.allInit(1);
			// label에 날짜 출력
			label.setText(hCalendar.getCalText());
		}
	}

	public static void main(String[] args) {
		new Exam28();
	}
}
// HCalendar.java
package calendar;

import java.util.Calendar;

import javax.swing.JButton;

// 날짜 관리
// => 버튼에 날짜 출력
// => 년월을 문자열로 만들어서 리턴
public class HCalendar {
	JButton[] buttons;
	Calendar calendar = Calendar.getInstance();
	int year, month;
	
	public HCalendar(JButton[] buttons) {
		this.buttons = buttons;
		year = calendar.get(Calendar.YEAR);
		month = calendar.get(Calendar.MONTH) + 1;
	}
	
	// 년월 문자열 리턴
	public String getCalText() {
		return year + "년 " + month + "월";
	}	
	
	// 버튼에 날짜 출력
	public void calSet() {
		// 그달의 1일로 날짜 수정
		calendar.set(year, month - 1, 1);
		// 요일수 : 그날이 일주일 기준으로 며칠째인지 나타냄
		// => 배열이 0부터 이름이 시작되기 때문에
		// => "요일수 - 1"로 사용
		int firstDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		// 그달의 총일수 구하기
		int totalDays = calendar.getActualMaximum(Calendar.DATE);
		
		for(int i=1; i<=totalDays; i++) {
			// buttons[0]~buttons[6] : 일~토
			// 그달의 1일은 buttons[6 + (요일수 - 1) + i]
			buttons[6 + firstDay + i].setText(String.valueOf(i));
		}
	}
	
	// 달력을 새로운 년월로 새로 그리기
	public void allInit(int gap) {
		// 버튼의 날짜 지우기
		for(int i=7; i<buttons.length; i++) {
			buttons[i].setText("");
		}
		// 년, 월 변수값 수정
		month += gap;
		if(month <= 0) {
			year--;
			month = 12;
		} else if(month >= 13) {
			year++;
			month = 1;
		}
		
		// 버튼에 년월 출력
		calSet();
	}
}

'Study > Java' 카테고리의 다른 글

[Java/Eclipse] Java 56일차  (0) 2022.12.02
[Java/Eclipse] Java 55일차  (0) 2022.12.01
[Java/Eclipse] Java 53일차  (0) 2022.12.01
[Java/Eclipse] Java 52일차  (0) 2022.11.28
[Java/Eclipse] Java 51일차  (0) 2022.11.25