개발 기록

Calendar 클래스[달력 만들기] 본문

Java/javaSE

Calendar 클래스[달력 만들기]

청군로 2021. 6. 2. 17:06

자바에서는 시간과 날짜에 관련된 Calendar 클래스가 있다.

이 클래스를 사용하면 현재 시간, 요일, 월, 년도 등 날짜에 관련된 다양한 정보를 구할 수 있다.

 

생성

Calendar 클래스는 추상클래스여서 직접 객체를 생성할 수가 없다. 따라서 static메서드인 getInstance()를 사용해

가져와야 한다. 

Calendar cal = Calendar.getInstance( );  //캘린더 객체 가져오기

Calendar객체를 가져올 때 날짜가 기본 값으로 설정된다.

 

따라서 년도 월 일 을 가져오면 현재의 날짜를 가져온다. 날짜를 가져오는 메서드는 굉장히 다양하기 때문에 몇 가지만 알려드리면, 객체.get( 상수 ) 다음과 같은 형식으로 쓸 수 있다. cal변수에 Calendar 객체를 담았다고 생각하고,

cal.get(Calendar.YEAR); // 반환형은 int이며 년도를 반환한다. ex)2021을 반환

cal.get(Calendar.MONTH); //반환형은 int이며 월을 반환한다. 월은 1부터 시작이 아니라 0부터 시작한다. 따라서

실제 월 1 2 3 4 5 6 7 8 9 10 11

반환 값 0 1 2 3 4 5 6 7 8  9  10

다음과 같이 반환된다. 요번 달이 6월이라면 반환 값은 5가 된다!!! 이 점 주의하시고,

cal.get(Calendar.DATE); //반환형은 int이며 몇 일인지를 반환. 

 

cal.get(Calendar.DAY_OF_WEEK); 이건 현재 요일이 몇 번째 요일인지를 반환한다.

여기서 주의할 점은  요일의 시작은 일요일이며 1부터 시작한다.

즉,       요일  일 월 화 수 목 금 토

        반환 값  1  2  3  4  5   6  7    오늘이 수요일이라면 반환 값은 4가 된다.

 

이 Calendar 객체를 이용해 달력을 쉽게 만들 수 있다.

 

Diray.java

package app0602.cal.diary;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Vector;

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

import app0602.common.StringManager;

public class Diary extends JFrame{
	
	String[] dayAr = {"Sun", "Mon", "Tue", "Wen", "Thur", "Fri", "Sat"};
	DateBox[] dateBoxAr = new DateBox[dayAr.length*6];
	JPanel p_north;
	JButton bt_prev;
	JLabel lb_title;
	JButton bt_next;
	JPanel p_center; //날짜 박스 처리할 영역
	Calendar cal; //날짜 객체
	
	int yy; //기준점이 되는 년도
	int mm; //기준점이 되는 월
	int startDay; //월의 시작 요일
	int lastDate; //월의 마지막 날
	
	//생성자
	public Diary() {
		//디자인
		p_north = new JPanel();
		bt_prev = new JButton("이전");
		lb_title = new JLabel("년도 올 예정", SwingConstants.CENTER);
		bt_next = new JButton("다음");
		p_center = new JPanel();
		
		//라벨에 폰트 설정
		lb_title.setFont(new Font("Arial-Black", Font.BOLD, 25));
		lb_title.setPreferredSize(new Dimension(300, 30));
		
		p_north.add(bt_prev);
		p_north.add(lb_title);
		p_north.add(bt_next);
		add(p_north, BorderLayout.NORTH);
		add(p_center);
		
		//이전 버튼을 눌렀을 때 전 월로 이동해야함
		bt_prev.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				updateMonth(-1);
			}
		});
		
		//다음 버튼을 눌렀을 때 다음 달로 이동해야함
		bt_next.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				updateMonth(1);
			}
		});
		
		getCurrentDate(); //현재 날짜 객체 생성
		getDateInfo(); //날짜 객체로부터 정보들 구하기
		setDateTitle(); //타이틀 라벨에 날짜 표시하기
		createDay(); //요일 박스 생성
		createDate(); //날짜 박스 생성
		printDate(); //상자에 날짜 그리기
		
		setVisible(true);
		setBounds(100, 100, 780, 780);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	//현재날짜 객체 만들기
	public void getCurrentDate() {
		cal = Calendar.getInstance();
	}
	
	//시작 요일, 끝 날 등 구하기
	public void getDateInfo() {
		yy = cal.get(Calendar.YEAR);
		mm = cal.get(Calendar.MONTH);
		startDay = getFirstDayOfMonth(yy, mm);
		lastDate = getLastDate(yy, mm);
	}
	
	//요일 생성
	public void createDay() {
		for(int i = 0; i < 7; i++){
			DateBox dayBox = new DateBox(dayAr[i], Color.gray, 100, 70);
			p_center.add(dayBox);
		}
	}
	
	//날짜 생성
	public void createDate() {
		for(int i = 0; i < dayAr.length*6; i++) {
			DateBox dateBox = new DateBox("", Color.LIGHT_GRAY, 100, 100);
			p_center.add(dateBox);
			dateBoxAr[i] = dateBox;
		}
	}
	
	//해당 월의 시작 요일 구하기
	//개발 원리 : 날짜 객체를 해당 월의 1일로 조작한 후, 요일 구하기
	//사용 방법 : 2021년 2월을 구할시 2021, 1을 넣으면 됨
	public int getFirstDayOfMonth(int yy, int mm) {
		Calendar cal = Calendar.getInstance(); //날짜 객체 생성
		cal.set(yy, mm, 1);
		return cal.get(Calendar.DAY_OF_WEEK)-1;//요일은 1부터 시작으로 배열과 쌍을 맞추기 위해 -1
	}
	
	//사용 방법 : 2021년 2월을 구할시 2021, 1을 넣으면 됨
	public int getLastDate(int yy, int mm) {
		Calendar cal = Calendar.getInstance();
		cal.set(yy, mm+1, 0);
		//마지막 날을 의미한다.
		return cal.get(Calendar.DATE);
	}
	
	//날짜 박스에 날짜 출력하기
	public void printDate() {
		System.out.println("시작 요일"+startDay);
		System.out.println("마지막 일"+lastDate);
		
		int n = 1;
		for(int i = 0; i < dateBoxAr.length; i++) {
			if(i >= startDay && n <= lastDate) {
				dateBoxAr[i].day = Integer.toString(n);
				dateBoxAr[i].repaint();
				n++;
			}else {
				dateBoxAr[i].day = "";
				dateBoxAr[i].repaint();
			}
		}
	}
	
	//달력을 넘기거나 전으로 이동할 때 날짜 객체에 대한 정보도 변경
	public void updateMonth(int data) {
		//캘린더 객체에 들어있는 날짜를 기준으로 월 정보를 바꿔준다.
		cal.set(Calendar.MONTH, mm+data);
		getDateInfo();
		printDate();
		setDateTitle();
	}
	
	//몇년도 몇월인지를 보여주는 타이틀 라벨의 값을 변경
	public void setDateTitle() {
		lb_title.setText(yy+"-"+StringManager.getZeroString(mm+1));
		lb_title.updateUI();
	}
	
	public static void main(String[] args) {
		new Diary();
	}
}

 

DateBox.java

package app0602.cal.diary;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;

//달력의 반복되는 판넬을 객체로 만들어 생성하기
public class DateBox extends JPanel{
	String day;
	Color color;
	int width;
	int height;
	
	public DateBox(String day, Color color, int width, int height) {
		this.day = day;
		this.color = color;
		this.width = width;
		this.height = height;
		setPreferredSize(new Dimension(width, height));		
	}
	
	//paint를 재정의하면 컴포넌트에 내가 원하는 것을 그릴 수 있다.
	//이를 이용해서 배경색과 글씨를 넣기
	public void paint(Graphics g) {
		g.setColor(color);
		//꽉찬 상자를 넣는 것인데 위에서 설정한 색으로 배경색을 칠하는 것
		g.fillRect(0, 0, width, height);
		
		g.setColor(Color.yellow);
		//글씨를 그리는 것인데 첫번 째 매개변수는 글씨의 내용
		//2번째는 x축  3번째는 y축
		g.drawString(day, 10, 20);
	}
}

 

StringManager.java

package app0602.common;

public class StringManager {

	//넘겨받은 인수가 1자리 수 인 경우 앞에 '0' 문자를 붙이고
	//2자리 수면 그냥 쓴다.
	public static String getZeroString(int n) {
		return (n < 10)? "0"+n : Integer.toString(n);
	}
}

 

실행화면

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

java 메일 보내기[Gmail]  (0) 2021.06.04
파일의 입출력[java / io]  (0) 2021.06.02
Thread-쓰레드[java]  (0) 2021.05.27
자바 GUI 띄우기[JFrame]  (0) 2021.05.12
overriding[java]  (0) 2021.05.03
Comments