본문 바로가기
자바

자바 자바fx 달력 만들기(2) 두번째 예제 [김철수홍길동]

by 세상 모든 것 들은 그 자신을 위해 존재한다. 2021. 2. 17.

달력 만들기(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
반응형

댓글