달력 만들기(1) 첫 번째 예제에 추가하여 실행해 보시면 되겠습니다.
Main.java파일과 calendar.fxml파일은 그대로 사용하시면 되시고,
Calendar.java 핸들러 파일에 다음의 예제를 추가하면 됩니다.
@FXML // 이번달 달력을 표시하는 부분 입니다
void todayClick(ActionEvent event) {
clearLabel();
sundayRedLabel();
saturdayBlueLabel();
normalDayBlack();
booStopBlink = true;
int nTodaycurrentYear = date.getYear();
int nTodaycurrentMonthInt = date.getMonthValue();
fillUpCalendar(nTodaycurrentYear, nTodaycurrentMonthInt);
String strYearMonth = nTodaycurrentYear + "년" + nTodaycurrentMonthInt + "월";
btnToday.setText(strYearMonth);
currentYear = date.getYear();
currentMonthInt = date.getMonthValue();
}
//----------------- 함수를 시작하는 부분--------------------------
// 화면을 채우는 함수
public void fillUpCalendar(int currentYear, int currentMonthInt) {
firstAndLastDay = YearMonth.of(currentYear, currentMonthInt); // YearMonth
strFirstWeek = firstAndLastDay.atDay(1).getDayOfWeek().name(); // String
strLastWeek = firstAndLastDay.atEndOfMonth().getDayOfWeek().name(); // String
//System.out.println("strFirstWeek" + strFirstWeek);
//System.out.println("strLastWeek" + strLastWeek);
int dateOf = 0; // 날짜 표시숫자
int nRow = 1; // 행
int nCol = 0; // 열
int nPrevious = 0; // 이번달 1일이 나오기전의 빈칸
int nextMonthDate = 0;
int nextRow = 0;
int nextCol = 0;
LocalDate newDate = LocalDate.of(currentYear, currentMonthInt, 1);
int lengthOfMon = newDate.lengthOfMonth();
//System.out.println("lengthOfMon :lengthOfMon" + lengthOfMon);
// 날짜 채우기
for (nRow = 1; nRow < 7; nRow++) {
if (strFirstWeek.equals("MONDAY") && nRow == 1) {
nCol = 1;
nPrevious = nCol;
} else if (strFirstWeek.equals("TUESDAY") && nRow == 1) {
nCol = 2;
nPrevious = nCol;
} else if (strFirstWeek.equals("WEDNESDAY") && nRow == 1) {
nCol = 3;
nPrevious = nCol;
} else if (strFirstWeek.equals("THURSDAY") && nRow == 1) {
nCol = 4;
nPrevious = nCol;
} else if (strFirstWeek.equals("FRIDAY") && nRow == 1) {
nCol = 5;
nPrevious = nCol;
} else if (strFirstWeek.equals("SATURDAY") && nRow == 1) {
nPrevious = nCol = 6;
} else
nCol = 0;
// Filling the dates
for (nCol = nCol; nCol < 7; nCol++) {
if (lengthOfMon == dateOf) {
nextMonthDate = 42 - dateOf - nPrevious;
break;
}
dateOf++;
LocalDateTime date1 = LocalDateTime.now();
int day = date1.getDayOfMonth();
int mon = date1.getMonthValue();
int yr = date1.getYear();
//오늘날짜와 다른 부분을 구분하는 부분
if (dateOf == day && mon == currentMonthInt && yr == currentYear) {
String strDateOf = ""+dateOf;
labelList[dateOf + nPrevious - 1].setText(strDateOf);
int nNum = dateOf + nPrevious - 1;
compareIljiListAndPrintVboxColor(currentYear,currentMonthInt,dateOf);
// --------------------------------오늘날짜 깜빡이는부분------------------------------
Thread thread = new Thread() {
@Override
public void run() {
while (booStopBlink) {
blinkDate(nNum);
blinkDateColorReturn(nNum);
}
};
};
thread.setDaemon(true);
thread.start();
// ----------------깜빡이는 부분 끝
nextCol = nCol;
nextRow = nRow;
} else {
labelList[dateOf + nPrevious - 1].setText("" + dateOf);
labelList[dateOf + nPrevious - 1].setStyle("-fx-border-color: black;");
nextCol = nCol;
nextRow = nRow;
compareIljiListAndPrintVboxColor(currentYear,currentMonthInt,dateOf);
}
}
}
//------------------------------------지난달 표시 부분----------------
int nLen = nPrevious; // 4
LocalDate ldate = LocalDate.of(currentYear, currentMonthInt, 1);
// 지난달을 표시해야 되므로 1씩 빼준다.
if (currentMonthInt == 1) {
ldate = LocalDate.of(currentYear, 12, 1);
} else {
ldate = LocalDate.of(currentYear, currentMonthInt - 1, 1);
}
int nPastDays = ldate.lengthOfMonth();
nPastDays = nPastDays - nPrevious;
for (int j = 0; j < nLen; j++) {
nPastDays++;
labelList[j].setText("" + nPastDays);
labelList[j].setTextFill(Color.LIGHTSEAGREEN);
}
// ------------------------------------다음달표시 부분----------------
int nTemp = 0;
int nForNextMonth = 0;
// nCol =0;
// nRow =5;
// nextCol = 0;
// nextRow = 5;
for (int i = nextRow; i < 7; i++) {
if (i < 6)
nTemp = nextCol + 1;
else if (nextMonthDate <= 7)
nTemp = 7 - nextMonthDate;
else
nTemp = 0;
for (int j = nTemp; j < 7; j++) {
nForNextMonth++;
labelList[nForNextMonth + dateOf + nPrevious - 1].setText("" + nForNextMonth);
labelList[nForNextMonth + dateOf + nPrevious - 1].setTextFill(Color.LIGHTSEAGREEN);
}
}
} // 화면채우는 함수 끝
//---------해당일에 일지가 있는지 비교해서 있으면 hbox를 표시하는 부분
public void compareIljiListAndPrintVboxColor(int currentYear,int currentMonthInt,int dateOf) {
//업무일지 리스트와 상태를 저장할 배열
// String[] strArrIljiList;
// String[] strArrIljiState;
// int currentYear = date.getYear();
// int currentMonthInt = date.getMonthValue();
//해당일에 업무일지가 있는지를 찾는부분
// 실제는 한자리로 표시되지만 출력시 두자리로 표시하기 위해 앞에 0을 붙임
String strDateOf = ""+dateOf;
if (strDateOf.length() == 1) {
strDateOf = "0" + strDateOf;
}
String strCurrentMonthInt = null;
if (currentMonthInt < 10) {
strCurrentMonthInt = "0" + currentMonthInt;
} else {
strCurrentMonthInt = "" + currentMonthInt;
}
String strTotal = currentYear + "-" + strCurrentMonthInt + "-" + strDateOf;
//System.out.println("strTotal :" + strTotal);
//해당일에 업무일지가 있는지를 찾는부분
for(int i=0; i<strArrIljiList.length; i++) {
if(strArrIljiList[i].equals(strTotal)) {
System.out.println("strTotal :" + strTotal);
System.out.printf("strArrIljiList[%d] :[%s]\n" ,i,strArrIljiList[i]);
//-----------------일지의 상태를 알아보는부분 --------------------------
if (strArrIljiState[i].equals("01")) { // "[결제 완료]";
labelListIljiState[i+1].setBackground(new Background(new BackgroundFill(
Color.GREEN,CornerRadii.EMPTY, Insets.EMPTY)));
labelListIljiState[i+1].setText("결");
} else if (strArrIljiState[i].equals("--")) { //"(대기중)";
labelListIljiState[i+1].setBackground(new Background(new BackgroundFill(
Color.BLACK,CornerRadii.EMPTY, Insets.EMPTY)));
labelListIljiState[i+1].setText("대");
} else if (strArrIljiState[i].equals("02")) { //"(수정요청)";
labelListIljiState[i+1].setBackground(new Background(new BackgroundFill(
Color.RED,CornerRadii.EMPTY, Insets.EMPTY)));
labelListIljiState[i+1].setText("수");
} else if (strArrIljiState[i].equals("03")) { //"(수정완료)";
labelListIljiState[i+1].setBackground(new Background(new BackgroundFill(
Color.BLUE,CornerRadii.EMPTY, Insets.EMPTY)));
labelListIljiState[i+1].setText("완");
}
//labelList[i+1].setBackground(new Background(new BackgroundFill(Color.WHITE,CornerRadii.EMPTY, Insets.EMPTY)));
//labelList[i+1].setStyle("-fx-border-color: red;");
//break;
}else {
System.out.println("일치하지않습니다.");
}
}
}
//----------깜빡이는 함수 정의부분-------------
void blinkDate(int nNum) {
labelList[nNum].setVisible(false);
labelList[nNum].setBackground(new Background(new BackgroundFill(Color.PINK, CornerRadii.EMPTY, Insets.EMPTY)));
labelList[nNum].setStyle("-fx-border-color: black;");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
labelList[nNum].setVisible(true);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
//--------깜빡이는 배경색 원래대로 -----
void blinkDateColorReturn(int nNum) {
labelList[nNum].setBackground(new Background(new BackgroundFill(Color.WHITE, CornerRadii.EMPTY, Insets.EMPTY)));
// labelList[nNum].setStyle("-fx-background-color: white;");
}
//---라벨의 색을 흰색으로 바꾸는 함수
public void clearLabel() {
for (int i = 0; i < 42; i++) {
labelList[i].setText("");
labelList[i].setStyle("-fx-background-color: white;");
}
}
//----일요일의 레이블은 빨강색
public void sundayRedLabel() {
for (int i = 0; i < 42; i += 7) {
labelList[i].setTextFill(Color.RED);
}
}
//----토요일의 레이블은 파랑색
public void saturdayBlueLabel() {
for (int i = 6; i < 42; i += 7) {
labelList[i].setTextFill(Color.BLUE);
}
}
//평일은 검은색으로 표현
public void normalDayBlack() {
for (int i = 0; i < 42; i++) {
if (i % 7 == 6 || (i + 7) % 7 == 0) {
// System.out.println("if ; "+i);
// 아무것도 않함 일요일과 토요일은 예외
} else {
// System.out.println("else ; "+i);
labelList[i].setTextFill(Color.BLACK);
}
}
}
다음 달 표시 부분과 나머지 부분도 시간 나는 대로 만들어 올리겠습니다.
위의 내용을 그대로 복사해서 지난 첫번째 예제의 Calendar.java파일에
붙여 넣기 하시면 작동됩니다.
세상 모든 것들은 그 자신을 위해 존재한다.
728x90
반응형
'자바' 카테고리의 다른 글
자바 파일복사, 파일삭제, 파일이동 예제및 설명 [김철수홍길동] (0) | 2021.03.22 |
---|---|
자바 자바fx 달력 만들기(3) 세번째 예제 [김철수홍길동] (0) | 2021.02.19 |
자바 자바fx 달력 만들기(1) 첫번째 예제 [김철수홍길동] (0) | 2021.02.09 |
자바 특정달의 일수 구하기 [김철수홍길동] (0) | 2021.02.04 |
자바 특정일의 요일 구하기 [김철수홍길동] (0) | 2021.02.04 |
댓글