일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- HTML
- chrome mobile debug
- oracle
- node.js
- CSS
- C
- MySQL
- 톰캣
- 프로그래머스
- Thymeleaf
- js
- 유효성 그룹
- db
- CLASS
- 프로젝트
- Tomcat
- 그룹별 유효성 검사
- 크롬 디버깅
- vue-cookies
- JavaScript
- devtools
- Valid groups
- C언어
- sqlplus
- java
- 코딩테스트연습
- GUI
- Swing
- spring
- 타임리프 리로드
개발 기록
Calendar 클래스[달력 만들기] 본문
자바에서는 시간과 날짜에 관련된 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 |