- [eToLAND] ½½·Î°Ç °ø¸ðÀü -

javafx fxml ¿ù ´Þ·Â È­¸é ±¸Çö

[´ñ±Û¼ö (18)]
rank ¼¼Á¾´ë¿ÕÀ̵µ 2024-08-21 (¼ö) 08:03 Á¶È¸ : 533 Ãßõ : 6  Ãßõ  ½Å°í
rank AIê

JavaFX¿¡¼­ FXMLÀ» »ç¿ëÇÏ¿© ¿ù ´Þ·Â È­¸éÀ» ±¸ÇöÇÏ·Á¸é ´ÙÀ½ ´Ü°è¸¦ µû¸£½Ã¸é µË´Ï´Ù.

  1. FXML ÆÄÀÏ »ý¼º: Calendar.fxmlÀ̶ó´Â FXML ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù. ±âº»ÀûÀÎ ±¸Á¶´Â ´ÙÀ½°ú °°½À´Ï´Ù.
"1." encoding="UTF-8"?>
import javafx.scene.layout.GridPane?>




<VBox xmlns:fx="http://javafx.com/fxml" alignment="CENTER" spacing="10">
    <Label fx:id="monthLabel" text="2023³â 10¿ù" style="-fx-font-size: 24px;"/>
    <GridPane fx:id="calendarGrid" hgap="10" vgap="10" >
        
        <Label text="ÀÏ" />
        <Label text="¿ù" />
        <Label text="È­" />
        <Label text="¼ö" />
        <Label text="¸ñ" />
        <Label text="±Ý" />
        <Label textÅä" />
        
    GridPane>
    <Button text="ÀÌÀü" onAction="#handlePreviousMonth" />
    <Button text="´ÙÀ½" onAction="#handleNextMonth" />
VBox>
  1. ÄÁÆ®·Ñ·¯ Ŭ·¡½º »ý¼º: CalendarController.java¶ó´Â Ŭ·¡½º¸¦ »ý¼ºÇÏ¿© FXML°ú ¿¬°áÇÕ´Ï´Ù.
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;

public class CalendarController {
    @FXML
    private Label monthLabel;
    @FXML
    private GridPane calendarGrid;

    private LocalDate currentDate;

    public void initialize() {
        currentDate = LocalDate.now();
        updateCalendar();
    }

    private void updateCalendar() {
        calendarGrid.getChildren().clear();
        YearMonth yearMonth = YearMonth.from(currentDate);
        monthLabel.setText(yearMonth.format(DateTimeFormatter.ofPattern("yyyy³â M¿ù")));

        for (int day = 1; day <= yearMonth.lengthOfMonth(); day++) {
            LocalDate date = yearMonth.atDay(day);
            Button dayButton = new Button(String.valueOf(day));
            calendarGrid.add(dayButton, date.getDayOfWeek().getValue() % 7, (day + date.getDayOfWeek().getValue() - 1) / 7);
        }
    }

    @FXML
    private void handlePreviousMonth() {
        currentDate = currentDate.minusMonths(1);
        updateCalendar();
    }

    @FXML
    private void handleNextMonth() {
        currentDate = currentDate.plusMonths(1);
        updateCalendar();
    }
}
  1. ¸ÞÀÎ ¾ÖÇø®ÄÉÀÌ¼Ç Å¬·¡½º ÀÛ¼º: JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇÒ ¸ÞÀΠŬ·¡½º¸¦ ÀÛ¼ºÇÕ´Ï´Ù.
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class CalendarApp extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Calendar.fxml"));
        primaryStage.setTitle("¿ù ´Þ·Â");
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
  1. ÇÁ·ÎÁ§Æ® ½ÇÇà: ¸ðµç ÆÄÀÏÀÌ ÁغñµÇ¸é, CalendarApp Ŭ·¡½º¸¦ ½ÇÇàÇÏ¿© ¿ù ´Þ·Â ¾ÖÇø®ÄÉÀ̼ÇÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·¸°Ô Çϸé JavaFX¿Í FXMLÀ» »ç¿ëÇÏ¿© °£´ÜÇÑ ¿ù ´Þ·Â ºä¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ÇÊ¿äÇÑ °æ¿ì ½ºÅ¸ÀÏÀ̳ª ±â´ÉÀ» Ãß°¡ÇÏ¿© °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù.

´ñ±Û 18°³
´ñ±Û¾²±â
¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 19:32
aused by: java.lang.RuntimeException: Exception in Application start method
     
       
AIê 2024-08-21 (¼ö) 19:32
@¼¼Á¾´ë¿ÕÀ̵µ

ÀÌ ¿¡·¯ ¸Þ½ÃÁö´Â JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÃÀÛÇÏ´Â µ¿¾È ¹ß»ýÇßÀ½À» ³ªÅ¸³À´Ï´Ù. java.lang.RuntimeException: Exception in Application start method´Â JavaFX¿¡¼­ Application Ŭ·¡½ºÀÇ start() ¸Þ¼Òµå¿¡¼­ ¹ß»ýÇÑ ¿¹¿Ü·Î ÀÎÇØ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÃÀÛµÇÁö ¾Ê¾ÒÀ½À» ÀǹÌÇÕ´Ï´Ù.

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº Á¡µéÀ» È®ÀÎÇØ º¸¼¼¿ä:

  1. ¿¡·¯ ·Î±× È®ÀÎ: start() ¸Þ¼Òµå ³»¿¡¼­ ¹ß»ýÇÑ ±¸Ã¼ÀûÀÎ ¿¹¿Ü¸¦ È®ÀÎÇÕ´Ï´Ù. ·Î±×¿¡ ´õ »ó¼¼ÇÑ ¸Þ½ÃÁö°¡ ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù.

  2. FXML ÆÄÀÏ °æ·Î È®ÀÎ: ¸¸¾à FXMLÀ» »ç¿ëÇÏ°í ÀÖ´Ù¸é, FXML ÆÄÀÏÀÇ °æ·Î°¡ ¿Ã¹Ù¸¥Áö È®ÀÎÇϼ¼¿ä. °æ·Î°¡ À߸øµÇ¸é IOExceptionÀÌ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.

  3. ÇÊ¿äÇÑ ¶óÀ̺귯¸® È®ÀÎ: JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÇÊ¿äÇÑ ¸ðµç ¶óÀ̺귯¸®¸¦ Æ÷ÇÔÇÏ°í ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù. JavaFX ¶óÀ̺귯¸®°¡ Á¦´ë·Î ¼³Á¤µÇÁö ¾ÊÀ¸¸é ½ÇÇà Áß ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.

  4. start() ¸Þ¼Òµå ±¸Çö È®ÀÎ: start() ¸Þ¼ÒµåÀÇ ±¸ÇöÀ» öÀúÈ÷ °ËÅäÇÏ¿© À߸øµÈ Äڵ尡 ÀÖ´ÂÁö È®ÀÎÇϽʽÿÀ. ¿¹¸¦ µé¾î, NullPointerExceptionÀ̳ª IndexOutOfBoundsException µîÀÇ ¿¹¿Ü°¡ ¹ß»ýÇÒ ¼ö ÀÖ½À´Ï´Ù.

  5. Java ¹öÀü È®ÀÎ: JavaFX´Â ƯÁ¤ Java ¹öÀü¿¡¼­¸¸ Áö¿øµÉ ¼ö ÀÖÀ¸¹Ç·Î »ç¿ë ÁßÀÎ Java ¹öÀüÀÌ JavaFX¸¦ Áö¿øÇÏ´ÂÁö È®ÀÎÇØÁÖ¼¼¿ä. Java 11 ÀÌÈÄ¿¡´Â JavaFX°¡ ´õ ÀÌ»ó JDK¿¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¹Ç·Î º°µµ·Î ¼³Á¤ÇØ¾ß ÇÕ´Ï´Ù.

  6. »õ·Î¿î ÇÁ·ÎÁ§Æ®·Î Å×½ºÆ®: °£´ÜÇÑ JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀ» »õ·Î ¸¸µé¾î start() ¸Þ¼Òµå°¡ ¿Ã¹Ù¸£°Ô ÀÛµ¿ÇÏ´ÂÁö È®ÀÎÇÕ´Ï´Ù. À̷νá ÇöÀç ÇÁ·ÎÁ§Æ®ÀÇ ¼³Á¤À̳ª Äڵ忡¼­ ¹®Á¦°¡ ¹ß»ýÇÏ´Â °ÍÀÎÁö È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·± ´Ù¾çÇÑ Á¡°ËÀ» ÅëÇØ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÚ¼¼ÇÑ ¿¡·¯ ·Î±×°¡ ÀÖ´Ù¸é, ´õ¿í ±¸Ã¼ÀûÀÎ µµ¿òÀ» µå¸± ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 19:38
Caused by: java.lang.IllegalArgumentException: AnchorPane@1582871f[styleClass=root]is already set as root of another scene
     
       
AIê 2024-08-21 (¼ö) 19:38
@¼¼Á¾´ë¿ÕÀ̵µ

java.lang.IllegalArgumentException: AnchorPane@1582871f[styleClass=root] is already set as root of another scene ¿À·ù´Â JavaFX¿¡¼­ µ¿ÀÏÇÑ Node(¿©±â¼­´Â AnchorPane)¸¦ µÎ °³ ÀÌ»óÀÇ ¼­·Î ´Ù¸¥ SceneÀÇ ·çÆ®·Î ¼³Á¤ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÕ´Ï´Ù. JavaFX¿¡¼­ ÇϳªÀÇ Node´Â ÇÑ ¹ø¿¡ ÇϳªÀÇ Scene¿¡¸¸ ¼ÓÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» ½ÃµµÇØ º¸¼¼¿ä:

  1. »õ·Î¿î Pane »ý¼º: ±âÁ¸ÀÇ AnchorPaneÀ» Àç»ç¿ëÇÏÁö ¸»°í »õ·Î¿î PaneÀ» »ý¼ºÇÏ¿© °¢ SceneÀÇ ·çÆ®·Î »ç¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ¸Å¹ø new AnchorPane()À» È£ÃâÇÏ¿© »õ ÀνºÅϽº¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù.

  2. SetRoot() ¸Þ¼Òµå »ç¿ë: ±âÁ¸ÀÇ Scene¿¡ ´ëÇØ setRoot() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¿© »õ·Î¿î ·çÆ®¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì ±âÁ¸ÀÇ AnchorPaneÀº ´Ù¸¥ SceneÀÇ ·çÆ®¿¡¼­ Á¦°ÅµË´Ï´Ù.

    // ¿¹½Ã ÄÚµå
    Scene scene = new Scene(new AnchorPane());
    primaryStage.setScene(scene);
    
  3. FXML ÆÄÀÏ ¿¡¼­ Á¤ÀÇ: ¸¸¾à FXML ÆÄÀÏÀ» »ç¿ëÇÏ°í ÀÖ´Ù¸é, ÇØ´ç FXML ÆÄÀÏ¿¡¼­ AnchorPaneÀ» Á¤ÀÇÇÏ°í FXMLLoader¸¦ ÅëÇØ ºÒ·¯¿À´Â °æ¿ì, °¢ Scene¿¡¼­ ÇØ´ç FXMLÀ» ·ÎµåÇÒ ¶§ »õ·Î¿î ÀνºÅϽº¸¦ »ý¼ºÇϵµ·Ï ÇÕ´Ï´Ù.

    FXMLLoader loader = new FXMLLoader(getClass().getResource("your_layout.fxml"));
    AnchorPane pane = loader.load();  // »õ ÀνºÅϽº¸¦ °¡Á®¿É´Ï´Ù.
    primaryStage.setScene(new Scene(pane));
    
  4. Á¶°ÇºÎ °Ë»ç: ¾î¶² »óȲ¿¡¼­ AnchorPane¸¦ ¿©·¯ ¹ø ·çÆ®·Î ¼³Á¤ÇÏ°í ÀÖ´ÂÁö¸¦ °ËÅäÇØ º¸¼¼¿ä. ÄÚµåÀÇ ·ÎÁ÷À» °ËÅäÇÏ°í SceneÀ» º¯°æÇÒ ¶§ ÀÌ¹Ì ´Ù¸¥ Scene¿¡ ¼ÓÇØ ÀÖ´Â Node¿¡ Á¢±ÙÇÏÁö ¾Êµµ·Ï Çϼ¼¿ä.

  5. ¸®ÆÑÅ丵: ÀνºÅϽº¸¦ Àç»ç¿ëÇÏ´Â ¹æ½Ä ´ë½Å ÇÊ¿äÇÑ ¸¸Å­ »ý¼ºÇϵµ·Ï ÆÒ ±¸Á¶¸¦ ¸®ÆÑÅ丵ÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ¿Í °°Àº ¹æ¹ýÀ» ÅëÇØ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¡·¯°¡ ¹ß»ýÇÏ´Â Äڵ忡 ´ëÇÑ Á» ´õ ±¸Ã¼ÀûÀÎ ¼³¸íÀÌ ÀÖ´Ù¸é, ´õ¿í »ó¼¼ÇÑ µµ¿òÀ» µå¸± ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 19:48
´Þ·Â³¯Â¥¸¦ ¹öÆ° ¸»°í label·Î ¹Ù²ã
     
       
AIê 2024-08-21 (¼ö) 19:48
@¼¼Á¾´ë¿ÕÀ̵µ

´Þ·Â ³¯Â¥¸¦ ¹öÆ° ´ë½Å Label·Î Ç¥½ÃÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ°Ú½À´Ï´Ù. JavaFX¸¦ »ç¿ëÇÏ¿© ³¯Â¥¸¦ ¼±ÅÃµÈ ³¯Â¥¿¡ µû¶ó LabelÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸¿©µå¸®°Ú½À´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

"1." encoding="UTF-8"


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller">
    <Label fx:id="selectedDateLabel" text="¼±ÅÃµÈ ³¯Â¥" layoutX="20" layoutY="20" />
    <DatePicker fx:id="datePicker" layoutX="20" layoutY="50" onAction="#handleDatePickerAction" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

package your.package;

import javafx.fxml.FXML;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;

import java.time.LocalDate;

public class Controller {

    @FXML
    private DatePicker datePicker; // DatePicker UI ÄÄÆ÷³ÍÆ®

    @FXML
    private Label selectedDateLabel; // Label UI ÄÄÆ÷³ÍÆ®

    // DatePicker°¡ ¼±ÅÃµÉ ¶§ È£ÃâµÇ´Â ¸Þ¼­µå
    @FXML
    private void handleDatePickerAction() {
        LocalDate selectedDate = datePicker.getValue(); // ¼±ÅÃµÈ ³¯Â¥ °¡Á®¿È
        if (selectedDate != null) {
            selectedDateLabel.setText("¼±ÅÃµÈ ³¯Â¥: " + selectedDate.toString()); // Label¿¡ ³¯Â¥ ¼³Á¤
        }
    }
}

3. Main Ŭ·¡½º (Main.java)

package your.package;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml"));
        Scene scene = new Scene(loader.load());
        primaryStage.setTitle("´Þ·Â ¿¹Á¦");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

¼³¸í:

  1. FXML ÆÄÀÏ:

    • DatePicker¸¦ »ç¿ëÇÏ¿© ³¯Â¥¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.
    • ¼±ÅÃµÈ ³¯Â¥´Â Label¿¡ Ç¥½ÃµË´Ï´Ù.
  2. Controller Ŭ·¡½º:

    • handleDatePickerAction() ¸Þ¼Òµå´Â DatePicker¿¡¼­ ³¯Â¥°¡ ¼±ÅÃµÉ ¶§ È£ÃâµË´Ï´Ù.
    • ¼±ÅÃµÈ ³¯Â¥¸¦ Label¿¡ ¼³Á¤ÇÕ´Ï´Ù.
  3. Main Ŭ·¡½º:

    • JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀ» ºÎÆ®½ºÆ®·¦ÇÕ´Ï´Ù.

ÀÌ ¿¹Á¦¸¦ ÅëÇØ ¹öÆ° ´ë½Å LabelÀ» »ç¿ëÇÏ¿© ´Þ·Â¿¡¼­ ¼±ÅÃµÈ ³¯Â¥¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÊ¿ä¿¡ µû¶ó UI¸¦ Á¶Á¤Çϰųª Ãß°¡ ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 19:49
´Þ·ÂÀÇ Ç¥ÇüÅ·Π³¯Â¥¸¦ ¶óº§·Î Ãâ·Â
     
       
AIê 2024-08-21 (¼ö) 19:49
@¼¼Á¾´ë¿ÕÀ̵µ

´Þ·ÂÀÇ ³¯Â¥¸¦ ¹öÆ° ´ë½Å Label·Î Ç¥ ÇüÅ·ΠÃâ·ÂÇϱâ À§ÇØ JavaFX¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ°Ú½À´Ï´Ù. ¿©±â¼­´Â GridPaneÀ» »ç¿ëÇÏ¿© ³¯Â¥¸¦ Ç¥ÇüÅ·Πǥ½ÃÇÕ´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

"1." encoding="UTF-8"


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller">
    <Label text="´Þ·Â" layoutX="20" layoutY="20" />
    <GridPane fx:id="calendarGrid" layoutX="20" layoutY="50" hgap="10" vgap="10" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

package your.package;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.time.LocalDate;
import java.time.Month;
import java.time.YearMonth;

public class Controller {

    @FXML
    private GridPane calendarGrid; // GridPane UI ÄÄÆ÷³ÍÆ®

    @FXML
    public void initialize() {
        // ÇöÀç ¿¬µµ¿Í ¿ù¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿À±â
        LocalDate now = LocalDate.now();
        YearMonth yearMonth = YearMonth.of(now.getYear(), now.getMonth());
        
        // ¿ùÀÇ Ã¹Â° ³¯°ú ¸¶Áö¸· ³¯ °¡Á®¿À±â
        int daysInMonth = yearMonth.lengthOfMonth();
        LocalDate firstDayOfMonth = yearMonth.atDay(1);
        int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // 1(¿ù¿äÀÏ) ~ 7(ÀÏ¿äÀÏ)

        // °¢ ³¯Â¥¸¦ GridPane¿¡ Ãß°¡Çϱâ
        for (int day = 1; day <= daysInMonth; day++) {
            LocalDate date = LocalDate.of(now.getYear(), now.getMonth(), day);
            Label label = new Label(String.valueOf(day));
            label.setStyle("-fx-border-color: black; -fx-padding: 10; -fx-alignment: center;");

            // GridPaneÀÇ Æ¯Á¤ À§Ä¡¿¡ ³¯Â¥ Ãß°¡
            int row = (day + firstDayOfWeek - 1) / 7; // Çà °è»ê
            int col = (day + firstDayOfWeek - 1) % 7; // ¿­ °è»ê
            calendarGrid.add(label, col, row);
        }
    }
}

3. Main Ŭ·¡½º (Main.java)

package your.package;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml"));
        Scene scene = new Scene(loader.load());
        primaryStage.setTitle("´Þ·Â ¿¹Á¦");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

¼³¸í:

  1. FXML ÆÄÀÏ:

    • GridPaneÀ» »ç¿ëÇÏ¿© ³¯Â¥¸¦ Ç¥ ÇüÅ·Π¹èÄ¡ÇÕ´Ï´Ù.
  2. Controller Ŭ·¡½º:

    • ÇöÀç ¿¬µµ¿Í ¿ù¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿Í YearMonth °´Ã¼¸¦ »ý¼ºÇÕ´Ï´Ù.
    • ù ¹ø° ³¯°ú ¸¶Áö¸· ³¯À» °è»êÇÏ¿© °¢ ³¯Â¥¸¦ GridPane¿¡ Label·Î Ãß°¡ÇÕ´Ï´Ù.
    • °¢ ³¯Â¥´Â ÀûÀýÇÑ À§Ä¡¿¡ ¹èÄ¡µÇ¸ç, LabelÀÇ ½ºÅ¸ÀÏÀ» ÅëÇØ Å׵θ®¿Í ÆеùÀ» ¼³Á¤ÇÕ´Ï´Ù.
  3. Main Ŭ·¡½º:

    • JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀ» ºÎÆ®½ºÆ®·¦ÇÕ´Ï´Ù.

ÀÌ Äڵ带 ½ÇÇàÇϸé ÇöÀç ¿ùÀÇ ³¯Â¥°¡ Ç¥ ÇüÅ·ΠLabel·Î Ç¥½ÃµÇ´Â ´Þ·ÂÀÌ ³ªÅ¸³³´Ï´Ù. ÇÊ¿ä¿¡ µû¶ó µðÀÚÀÎÀ» Ãß°¡Çϰųª ´Ù¸¥ ±â´ÉÀ» ±¸ÇöÇÒ ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 19:56
cssÈ°¿ëÇؼ­ µðÀÚÀÎ ÇØÁà
     
       
AIê 2024-08-21 (¼ö) 19:56
@¼¼Á¾´ë¿ÕÀ̵µ

JavaFX¿¡¼­ CSS¸¦ »ç¿ëÇÏ¿© ³¯Â¥¸¦ Label·Î Ç¥½ÃÇÑ ´Þ·ÂÀÇ µðÀÚÀÎÀ» °³¼±ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾Æ·¡´Â CSS¸¦ È°¿ëÇÏ¿© ´Þ·ÂÀÇ ³¯Â¥ Label¿¡ ½ºÅ¸ÀÏÀ» Ãß°¡ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

"1" encoding="UTF-8"


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller" stylesheets="@styles.css">
    <Label text="´Þ·Â" layoutX="20" layoutY="20" styleClass="calendar-title" />
    <GridPane fx:id="calendarGrid" layoutX="20" layoutY="50" hgap="10" vgap="10" styleClass="calendar-grid" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

package your.package;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.time.LocalDate;
import java.time.YearMonth;

public class Controller {

    @FXML
    private GridPane calendarGrid; // GridPane UI ÄÄÆ÷³ÍÆ®

    @FXML
    public void initialize() {
        // ÇöÀç ¿¬µµ¿Í ¿ù¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Á®¿À±â
        LocalDate now = LocalDate.now();
        YearMonth yearMonth = YearMonth.of(now.getYear(), now.getMonth());
        
        // ¿ùÀÇ Ã¹Â° ³¯°ú ¸¶Áö¸· ³¯ °¡Á®¿À±â
        int daysInMonth = yearMonth.lengthOfMonth();
        LocalDate firstDayOfMonth = yearMonth.atDay(1);
        int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // 1(¿ù¿äÀÏ) ~ 7(ÀÏ¿äÀÏ)

        // °¢ ³¯Â¥¸¦ GridPane¿¡ Ãß°¡Çϱâ
        for (int day = 1; day <= daysInMonth; day++) {
            Label label = new Label(String.valueOf(day));
            label.getStyleClass().add("date-label"); // CSS ½ºÅ¸ÀÏ Àû¿ë

            // GridPaneÀÇ Æ¯Á¤ À§Ä¡¿¡ ³¯Â¥ Ãß°¡
            int row = (day + firstDayOfWeek - 1) / 7; // Çà °è»ê
            int col = (day + firstDayOfWeek - 1) % 7; // ¿­ °è»ê
            calendarGrid.add(label, col, row);
        }
    }
}

3. CSS ÆÄÀÏ (styles.css)

.calendar-title {
    -fx-font-size: 24px;
    -fx-font-weight: bold;
    -fx-alignment: center;
    -fx-text-fill: #333;
    -fx-padding: 10;
}

.calendar-grid {
    -fx-background-color: #f2f2f2;
    -fx-padding: 10;
}

.date-label {
    -fx-background-color: #ffffff;
    -fx-border-color: #ccc;
    -fx-border-width: 1px;
    -fx-padding: 10;
    -fx-font-size: 16px;
    -fx-min-width: 50px; /* ÃÖ¼Ò ³Êºñ */
    -fx-min-height: 50px; /* ÃÖ¼Ò ³ôÀÌ */
    -fx-alignment: center;
    -fx-cursor: hand; /* ¸¶¿ì½º Ä¿¼­¸¦ ¼Õ ¸ð¾çÀ¸·Î º¯°æ */
}

.date-label:hover {
    -fx-background-color: #eee; /* ¸¶¿ì½º È£¹ö ½Ã ¹è°æ»ö º¯°æ */
}

4. Main Ŭ·¡½º (Main.java)

package your.package;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml"));
        Scene scene = new Scene(loader.load());
        primaryStage.setTitle("Styled Calendar Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

¼³¸í:

  1. FXML ÆÄÀÏ:

    • stylesheets="@styles.css"¸¦ Ãß°¡ÇÏ¿© CSS ÆÄÀÏÀ» Àû¿ëÇÕ´Ï´Ù.
    • styleClass ¼Ó¼ºÀ» »ç¿ëÇÏ¿© CSS Ŭ·¡½º(calendar-title, calendar-grid)¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
  2. Java ÄÚµå:

    • °¢ ³¯Â¥¿¡ date-label Ŭ·¡½º¸¦ Ãß°¡ÇÏ¿© CSS ½ºÅ¸ÀÏÀ» Àû¿ëÇÕ´Ï´Ù.
  3. CSS ÆÄÀÏ:

    • .calendar-title: Á¦¸ñ LabelÀÇ ½ºÅ¸ÀÏÀ» ¼³Á¤ÇÕ´Ï´Ù.
    • .calendar-grid: GridPaneÀÇ ¹è°æ»ö°ú ÆеùÀ» ¼³Á¤ÇÕ´Ï´Ù.
    • .date-label: ³¯Â¥ LabelÀÇ ¹è°æ, Å׵θ®, ÆùÆ® Å©±â ¹× ÆеùÀ» ¼³Á¤ÇÕ´Ï´Ù. ¶ÇÇÑ ÃÖ¼Ò Å©±â¸¦ ¼³Á¤ÇÏ°í ¸¶¿ì½º Ä¿¼­¸¦ ¼Õ ¸ð¾çÀ¸·Î º¯°æÇÕ´Ï´Ù.
    • .date-label:hover: ¸¶¿ì½º°¡ ³¯Â¥ Label À§¿¡ ¿Ã¶ó°¬À» ¶§ ¹è°æ»öÀ» º¯°æÇÕ´Ï´Ù.

ÀÌ Äڵ带 ½ÇÇàÇÏ¸é ´Þ·ÂÀÌ ´õ¿í º¸±â ÁÁ°Ô ½ºÅ¸ÀϸµµÈ Label·Î Ç¥½ÃµË´Ï´Ù. ÇÊ¿ä¿¡ µû¶ó CSS ½ºÅ¸ÀÏÀ» Á¶Á¤ÇÏ¿© ´õ ¸¹Àº µðÀÚÀÎÀû ¿ä¼Ò¸¦ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 20:01
´ÙÀ½´Þ ÀÌÀü´Þ ¹öÆ° Ãß°¡ÇÏ°í ±â´Éµµ Ãß°¡
     
       
AIê 2024-08-21 (¼ö) 20:01
@¼¼Á¾´ë¿ÕÀ̵µ

JavaFX ´Þ·Â¿¡ ´ÙÀ½ ´Þ°ú ÀÌÀü ´Þ·Î À̵¿ÇÒ ¼ö ÀÖ´Â ¹öÆ°À» Ãß°¡ÇÏ°í ±â´ÉÀ» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ°Ú½À´Ï´Ù. ÀÌ ¹öÆ°À» »ç¿ëÇÏ¿© ´Þ·ÂÀ» µ¿ÀûÀ¸·Î º¯°æÇÒ ¼ö ÀÖ½À´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

"1." encoding="UTF-8"?>
import javafx.scene.control.*?>


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller" stylesheets="@styles.css">
    <Label text="´Þ·Â" layoutX="20" layoutY="20" styleClass="calendar-title" />
    
    <Button text="ÀÌÀü ´Þ" layoutX="20" layoutY="50" onAction="#handlePreviousMonth" />
    <Button text="´ÙÀ½ ´Þ" layoutX="100" layoutY="50" onAction="#handleNextMonth" />
    
    <GridPane fx:id="calendarGrid" layoutX="20" layoutY="90" hgap="10" vgap="10" styleClass="calendar-grid" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

package your.package;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.time.LocalDate;
import java.time.YearMonth;

public class Controller {

    @FXML
    private GridPane calendarGrid;
    
    private LocalDate currentDate; // ÇöÀç ³¯Â¥¸¦ ÃßÀûÇÕ´Ï´Ù

    @FXML
    public void initialize() {
        currentDate = LocalDate.now(); // ÇöÀç ³¯Â¥·Î ÃʱâÈ­
        updateCalendar(); // Ãʱ⠴޷ ¾÷µ¥ÀÌÆ®
    }

    // ´Þ·ÂÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â ¸Þ¼Òµå
    private void updateCalendar() {
        calendarGrid.getChildren().clear(); // ÀÌÀü ³¯Â¥ Á¦°Å

        YearMonth yearMonth = YearMonth.from(currentDate); // ÇöÀç ¿¬µµ¿Í ¿ù °¡Á®¿À±â
        int daysInMonth = yearMonth.lengthOfMonth();
        LocalDate firstDayOfMonth = yearMonth.atDay(1);
        int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // 1(¿ù¿äÀÏ) ~ 7(ÀÏ¿äÀÏ)

        // °¢ ³¯Â¥¸¦ GridPane¿¡ Ãß°¡Çϱâ
        for (int day = 1; day <= daysInMonth; day++) {
            Label label = new Label(String.valueOf(day));
            label.getStyleClass().add("date-label");

            // GridPaneÀÇ Æ¯Á¤ À§Ä¡¿¡ ³¯Â¥ Ãß°¡
            int row = (day + firstDayOfWeek - 2) / 7; // Çà °è»ê
            int col = (day + firstDayOfWeek - 2) % 7; // ¿­ °è»ê
            calendarGrid.add(label, col, row);
        }

        // GridPane ¸®¼Â
        calendarGrid.requestLayout();
    }

    // ÀÌÀü ´Þ·Î À̵¿
    @FXML
    private void handlePreviousMonth() {
        currentDate = currentDate.minusMonths(1); // ÇöÀç ³¯Â¥¿¡¼­ ÇÑ ´Þ »©±â
        updateCalendar(); // ´Þ·Â ¾÷µ¥ÀÌÆ®
    }

    // ´ÙÀ½ ´Þ·Î À̵¿
    @FXML
    private void handleNextMonth() {
        currentDate = currentDate.plusMonths(1); // ÇöÀç ³¯Â¥¿¡¼­ ÇÑ ´Þ ´õÇϱâ
        updateCalendar(); // ´Þ·Â ¾÷µ¥ÀÌÆ®
    }
}

3. CSS ÆÄÀÏ (styles.css)

.calendar-title {
    -fx-font-size: 24px;
    -fx-font-weight: bold;
    -fx-alignment: center;
    -fx-text-fill: #333;
    -fx-padding: 10;
}

.calendar-grid {
    -fx-background-color: #f2f2f2;
    -fx-padding: 10;
}

.date-label {
    -fx-background-color: #ffffff;
    -fx-border-color: #ccc;
    -fx-border-width: 1px;
    -fx-padding: 10;
    -fx-font-size: 16px;
    -fx-min-width: 50px; /* ÃÖ¼Ò ³Êºñ */
    -fx-min-height: 50px; /* ÃÖ¼Ò ³ôÀÌ */
    -fx-alignment: center;
    -fx-cursor: hand; /* ¸¶¿ì½º Ä¿¼­¸¦ ¼Õ ¸ð¾çÀ¸·Î º¯°æ */
}

.date-label:hover {
    -fx-background-color: #eee; /* ¸¶¿ì½º È£¹ö ½Ã ¹è°æ»ö º¯°æ */
}

4. Main Ŭ·¡½º (Main.java)

package your.package;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml"));
        Scene scene = new Scene(loader.load());
        primaryStage.setTitle("Styled Calendar Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

¼³¸í:

  1. FXML ÆÄÀÏ:

    • "ÀÌÀü ´Þ"°ú "´ÙÀ½ ´Þ" ¹öÆ°À» Ãß°¡ÇÏ¿© °¢°¢ÀÇ ¹öÆ°ÀÌ ControllerÀÇ ¸Þ¼Òµå¸¦ È£ÃâÇϵµ·Ï ¼³Á¤ÇÕ´Ï´Ù.
  2. Controller Ŭ·¡½º:

    • LocalDate currentDate º¯¼ö¸¦ »ç¿ëÇÏ¿© ÇöÀç ³¯Â¥¸¦ Æ®·¡Å·ÇÕ´Ï´Ù.
    • updateCalendar() ¸Þ¼Òµå´Â GridPaneÀ» ¾÷µ¥ÀÌÆ®ÇÏ¿© ÇöÀç ¿ùÀÇ ³¯Â¥¸¦ Ç¥½ÃÇϵµ·Ï ÇÕ´Ï´Ù.
    • handlePreviousMonth()¿Í handleNextMonth() ¸Þ¼Òµå´Â ÇöÀç ³¯Â¥¸¦ ÇÑ ´Þ¾¿ À̵¿ÇÏ°í ´Þ·ÂÀ» ¾÷µ¥ÀÌÆ®ÇÕ´Ï´Ù.
  3. CSS ÆÄÀÏ:

    • ±âÁ¸ÀÇ CSS¸¦ ±×´ë·Î »ç¿ëÇÏ¿© ÀüüÀûÀ¸·Î µðÀÚÀÎÀ» À¯ÁöÇÕ´Ï´Ù.
  4. Main Ŭ·¡½º:

    • JavaFX ¾ÖÇø®ÄÉÀ̼ÇÀ» ºÎÆ®½ºÆ®·¦ÇÕ´Ï´Ù.

ÀÌÁ¦ ¾ÖÇø®ÄÉÀ̼ÇÀ» ½ÇÇàÇϸé ÀÌÀü ´Þ°ú ´ÙÀ½ ´Þ·Î À̵¿ÇÒ ¼ö ÀÖ´Â ¹öÆ°ÀÌ Ãß°¡µÈ ´Þ·ÂÀÌ Ç¥½ÃµË´Ï´Ù. ¹öÆ°À» Ŭ¸¯ÇÒ ¶§¸¶´Ù ´Þ·ÂÀÌ ¾÷µ¥ÀÌÆ®µÇ¾î ¼±ÅÃµÈ ¿ùÀÇ ³¯Â¥¸¦ º¸¿©ÁÖ°Ô µË´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 20:09
³¯Â¥¸¦ Ŭ¸¯ÇÏ¸é »õâÀÌ ¶ß°í ÀÔÃâ±Ý ³»¿ªÀ» ÀÔ·ÂÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
     
       
AIê 2024-08-21 (¼ö) 20:09
@¼¼Á¾´ë¿ÕÀ̵µ

JavaFX ¾ÖÇÃÄÉÀ̼ǿ¡¼­ ³¯Â¥¸¦ Ŭ¸¯ÇÏ¸é »õ·Î¿î âÀÌ ¿­¸®°í, »ç¿ëÀÚ°¡ ÀÔÃâ±Ý ³»¿ªÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» Ãß°¡ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÏ°Ú½À´Ï´Ù. À̸¦ À§ÇØ ³¯Â¥ Ŭ¸¯ À̺¥Æ®¸¦ ó¸®ÇÏ°í, »õ âÀÇ UI¸¦ ¼³°èÇÕ´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

±âÁ¸ÀÇ calendar.fxml ÆÄÀÏÀº µ¿ÀÏÇÏ°Ô À¯ÁöÇϵÇ, ³¯Â¥ Ŭ¸¯ À̺¥Æ® Çڵ鷯¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.

"1" encoding="UTF-8"?>



<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller" stylesheets="@styles.css">
    <Label text="´Þ·Â" layoutX="20" layoutY="20" styleClass="calendar-title" />
    
    <Button text="ÀÌÀü ´Þ" layoutX="20" layoutY="50" onAction="#handlePreviousMonth" />
    <Button text="´ÙÀ½ ´Þ" layoutX="100" layoutY="50" onAction="#handleNextMonth" />
    
    <GridPane fx:id="calendarGrid" layoutX="20" layoutY="90" hgap="10" vgap="10" styleClass="calendar-grid" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

³¯Â¥ Ŭ¸¯ ½Ã »õ âÀ» ¿©´Â ±â´ÉÀ» Ãß°¡ÇÕ´Ï´Ù.

package your.package;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.scene.control.TextField;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;

import java.time.LocalDate;
import java.time.YearMonth;

public class Controller {

    @FXML
    private GridPane calendarGrid;
    
    private LocalDate currentDate;

    @FXML
    public void initialize() {
        currentDate = LocalDate.now();
        updateCalendar();
    }

    private void updateCalendar() {
        calendarGrid.getChildren().clear();
        YearMonth yearMonth = YearMonth.from(currentDate);
        int daysInMonth = yearMonth.lengthOfMonth();
        LocalDate firstDayOfMonth = yearMonth.atDay(1);
        int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // 1(¿ù¿äÀÏ) ~ 7(ÀÏ¿äÀÏ)

        for (int day = 1; day <= daysInMonth; day++) {
            Label label = new Label(String.valueOf(day));
            label.getStyleClass().add("date-label");

            // ³¯Â¥ Ŭ¸¯ À̺¥Æ® Çڵ鷯 Ãß°¡
            label.setOnMouseClicked(event -> openTransactionWindow(currentDate.getYear(), currentDate.getMonthValue(), day));

            int row = (day + firstDayOfWeek - 2) / 7;
            int col = (day + firstDayOfWeek - 2) % 7;
            calendarGrid.add(label, col, row);
        }
    }

    @FXML
    private void handlePreviousMonth() {
        currentDate = currentDate.minusMonths(1);
        updateCalendar();
    }

    @FXML
    private void handleNextMonth() {
        currentDate = currentDate.plusMonths(1);
        updateCalendar();
    }

    // »õ â ¿­±â
    private void openTransactionWindow(int year, int month, int day) {
        Stage transactionStage = new Stage();
        transactionStage.initModality(Modality.APPLICATION_MODAL);
        transactionStage.setTitle("ÀÔÃâ±Ý ³»¿ª ÀÔ·Â");

        VBox vbox = new VBox();
        vbox.setSpacing(10);

        // ³¯Â¥ Ç¥½Ã
        Label dateLabel = new Label("³¯Â¥: " + year + "-" + month + "-" + day);
        TextField amountField = new TextField();
        amountField.setPromptText("±Ý¾×À» ÀÔ·ÂÇϼ¼¿ä");
        
        TextField descriptionField = new TextField();
        descriptionField.setPromptText("³»¿ªÀ» ÀÔ·ÂÇϼ¼¿ä");
        
        Button saveButton = new Button("ÀúÀå");
        saveButton.setOnAction(e -> {
            // TODO: ÀÔÃâ±Ý ³»¿ª ÀúÀå ·ÎÁ÷ Ãß°¡
            System.out.println("³¯Â¥: " + dateLabel.getText());
            System.out.println("±Ý¾×: " + amountField.getText());
            System.out.println("³»¿ª: " + descriptionField.getText());
            transactionStage.close(); // ⠴ݱâ
        });

        vbox.getChildren().addAll(dateLabel, amountField, descriptionField, saveButton);

        Scene scene = new Scene(vbox, 300, 200);
        transactionStage.setScene(scene);
        transactionStage.show();
    }
}

3. CSS ÆÄÀÏ (styles.css)

±âÁ¸ÀÇ CSS ÆÄÀÏÀ» ±×´ë·Î »ç¿ëÇÕ´Ï´Ù.

.calendar-title {
    -fx-font-size: 24px;
    -fx-font-weight: bold;
    -fx-alignment: center;
    -fx-text-fill: #333;
    -fx-padding: 10;
}

.calendar-grid {
    -fx-background-color: #f2f2f2;
    -fx-padding: 10;
}

.date-label {
    -fx-background-color: #ffffff;
    -fx-border-color: #ccc;
    -fx-border-width: 1px;
    -fx-padding: 10;
    -fx-font-size: 16px;
    -fx-min-width: 50px; /* ÃÖ¼Ò ³Êºñ */
    -fx-min-height: 50px; /* ÃÖ¼Ò ³ôÀÌ */
    -fx-alignment: center;
    -fx-cursor: hand; /* ¸¶¿ì½º Ä¿¼­¸¦ ¼Õ ¸ð¾çÀ¸·Î º¯°æ */
}

.date-label:hover {
    -fx-background-color: #eee; /* ¸¶¿ì½º È£¹ö ½Ã ¹è°æ»ö º¯°æ */
}

4. Main Ŭ·¡½º (Main.java)

±âÁ¸ ÄÚµå¿Í µ¿ÀÏÇÕ´Ï´Ù.

package your.package;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml"));
        Scene scene = new Scene(loader.load());
        primaryStage.setTitle("´Þ·Â ¿¹Á¦");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

¼³¸í:

  1. Controller Ŭ·¡½º:

    • ³¯Â¥ Label¿¡ Ŭ¸¯ À̺¥Æ® Çڵ鷯¸¦ Ãß°¡ÇÏ¿© »ç¿ëÀÚ°¡ ³¯Â¥¸¦ Ŭ¸¯ÇßÀ» ¶§ openTransactionWindow() ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù.
    • openTransactionWindow() ¸Þ¼Òµå´Â »õ âÀ» ¿­°í ÇØ´ç ³¯Â¥¿¡ ´ëÇÑ ±Ý¾×°ú ¼³¸íÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ´Â UI¸¦ Á¦°øÇÕ´Ï´Ù.
  2. ÀÔÃâ±Ý ³»¿ª ÀԷ â:

    • »õ â¿¡´Â ³¯Â¥¸¦ Ç¥½ÃÇÏ´Â Label, ±Ý¾×À» ÀÔ·ÂÇÏ´Â TextField, ³»¿ªÀ» ÀÔ·ÂÇÏ´Â TextField, ±×¸®°í ÀúÀå ¹öÆ°ÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
    • ÀúÀå ¹öÆ°À» Ŭ¸¯ÇÏ¸é ±Ý¾×°ú ³»¿ªÀ» Äֿܼ¡ Ãâ·ÂÇÏ°Ô µË´Ï´Ù. ÀÌ ºÎºÐÀº ½ÇÁ¦ ÀúÀå ·ÎÁ÷À¸·Î ´ëüÇÒ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ Äڵ带 ½ÇÇàÇÏ¸é »ç¿ëÀÚ°¡ ³¯Â¥¸¦ Ŭ¸¯ÇÒ ¶§¸¶´Ù ÀÔÃâ±Ý ³»¿ªÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ´Â »õ âÀÌ ¿­¸®°í, ÇØ´ç Á¤º¸¸¦ ÀÔ·ÂÇÑ ÈÄ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù.

¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 20:11
ÁÖ¼® ´Þ¾ÆÁà
     
       
AIê 2024-08-21 (¼ö) 20:11
@¼¼Á¾´ë¿ÕÀ̵µ

¾Æ·¡´Â Äڵ忡 ÁÖ¼®À» Ãß°¡ÇÑ ¹öÀüÀÔ´Ï´Ù. °¢ ÁÖ¿ä ºÎºÐ ¹× ±â´É¿¡ ´ëÇÑ ¼³¸íÀ» Æ÷ÇÔÇß½À´Ï´Ù.

1. FXML ÆÄÀÏ (calendar.fxml)

"1" encoding="UTF-8"?>
import javafx.scene.control.*?>


<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="your.package.Controller" stylesheets="@styles.css">
    <Label text="´Þ·Â" layoutX="20" layoutY="20" styleClass="calendar-title" />

    
    <Button text="ÀÌÀü ´Þ" layoutX="20" layoutY="50" onAction="#handlePreviousMonth" />
    
    
    <Button text="´ÙÀ½ ´Þ" layoutX="100" layoutY="50" onAction="#handleNextMonth" />

    
    <GridPane fx:id="calendarGrid" layoutX="20" layoutY="90" hgap="10" vgap="10" styleClass="calendar-grid" />
AnchorPane>

2. Java ÄÚµå (Controller.java)

package your.package;

import javafx.fxml.FXML; // FXML ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇϱâ À§ÇÑ Å¬·¡½º import
import javafx.scene.control.Label; // Label Ŭ·¡½º import
import javafx.scene.layout.GridPane; // GridPane Ŭ·¡½º¸¦ import
import javafx.stage.Modality; // ¸ð´Þ â »ý¼ºÀ» À§ÇÑ Å¬·¡½º import
import javafx.stage.Stage; // Stage Ŭ·¡½º import
import javafx.scene.control.TextField; // TextField Ŭ·¡½º import
import javafx.scene.control.Button; // Button Ŭ·¡½º import
import javafx.scene.layout.VBox; // VBox ·¹À̾ƿôÀ» »ç¿ëÇϱâ À§ÇÑ Å¬·¡½º import

import java.time.LocalDate; // ³¯Â¥¸¦ ´Ù·ç±â À§ÇÑ Å¬·¡½º import
import java.time.YearMonth; // ¿¬µµ¿Í ¿ù Á¤º¸¸¦ ´Ù·ç±â À§ÇÑ Å¬·¡½º import

public class Controller {

    @FXML
    private GridPane calendarGrid; // ³¯Â¥¸¦ Ç¥½ÃÇÒ GridPane ÄÄÆ÷³ÍÆ®

    private LocalDate currentDate; // ÇöÀç ¼±ÅÃµÈ ³¯Â¥¸¦ ÃßÀûÇÒ º¯¼ö

    @FXML
    public void initialize() {
        currentDate = LocalDate.now(); // ÇöÀç ³¯Â¥·Î ÃʱâÈ­
        updateCalendar(); // Ãʱ⠴޷ ¾÷µ¥ÀÌÆ®
    }

    // ´Þ·ÂÀ» ¾÷µ¥ÀÌÆ®ÇÏ´Â ¸Þ¼Òµå
    private void updateCalendar() {
        calendarGrid.getChildren().clear(); // ÀÌÀü ³¯Â¥ Label Á¦°Å
        YearMonth yearMonth = YearMonth.from(currentDate); // ÇöÀç ¿¬µµ¿Í ¿ù °¡Á®¿À±â
        int daysInMonth = yearMonth.lengthOfMonth(); // ÇöÀç ¿ùÀÇ ÃÑ ³¯Â¥ ¼ö
        LocalDate firstDayOfMonth = yearMonth.atDay(1); // ÇöÀç ¿ùÀÇ Ã¹Â° ³¯
        int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // ù° ³¯ÀÇ ¿äÀÏ(1=¿ù¿äÀÏ ~ 7=ÀÏ¿äÀÏ)

        // °¢ ³¯Â¥ LabelÀ» GridPane¿¡ Ãß°¡Çϱâ
        for (int day = 1; day <= daysInMonth; day++) {
            Label label = new Label(String.valueOf(day)); // ³¯Â¥ Label »ý¼º
            label.getStyleClass().add("date-label"); // CSS ½ºÅ¸ÀÏ Àû¿ë

            // ³¯Â¥ Ŭ¸¯ À̺¥Æ® Çڵ鷯 Ãß°¡
            label.setOnMouseClicked(event -> openTransactionWindow(currentDate.getYear(), currentDate.getMonthValue(), day));

            // GridPane¿¡ ³¯Â¥ ¹èÄ¡ (Çà°ú ¿­ °è»ê)
            int row = (day + firstDayOfWeek - 2) / 7; // Çà °è»ê
            int col = (day + firstDayOfWeek - 2) % 7; // ¿­ °è»ê
            calendarGrid.add(label, col, row); // GridPane¿¡ ³¯Â¥ Ãß°¡
        }

        // GridPane ¸®¼Â
        calendarGrid.requestLayout(); // ·¹À̾ƿô ¾÷µ¥ÀÌÆ® ¿äû
    }

    // ÀÌÀü ´Þ·Î À̵¿
    @FXML
    private void handlePreviousMonth() {
        currentDate = currentDate.minusMonths(1); // ÇöÀç ³¯Â¥¿¡¼­ ÇÑ ´Þ »©±â
        updateCalendar(); // ´Þ·Â ¾÷µ¥ÀÌÆ®
    }

    // ´ÙÀ½ ´Þ·Î À̵¿
    @FXML
    private void handleNextMonth() {
        currentDate = currentDate.plusMonths(1); // ÇöÀç ³¯Â¥¿¡¼­ ÇÑ ´Þ ´õÇϱâ
        updateCalendar(); // ´Þ·Â ¾÷µ¥ÀÌÆ®
    }

    // ³¯Â¥¸¦ Ŭ¸¯ÇßÀ» ¶§ ÀÔÃâ±Ý ³»¿ª ÀԷ â ¿­±â
    private void openTransactionWindow(int year, int month, int day) {
        Stage transactionStage = new Stage(); // »õ â(Stage) »ý¼º
        transactionStage.initModality(Modality.APPLICATION_MODAL); // ¸ð´Þ âÀ¸·Î ¼³Á¤
        transactionStage.setTitle("ÀÔÃâ±Ý ³»¿ª ÀÔ·Â"); // â Á¦¸ñ ¼³Á¤

        VBox vbox = new VBox(); // ¼öÁ÷ ¹Ú½º ·¹À̾ƿô »ý¼º
        vbox.setSpacing(10); // ÄÄÆ÷³ÍÆ® °£ °£°Ý ¼³Á¤

        // ³¯Â¥ Ç¥½Ã Label
        Label dateLabel = new Label("³¯Â¥: " + year + "-" + month + "-" + day);
        // ±Ý¾× ÀÔ·Â TextField
        TextField amountField = new TextField();
        amountField.setPromptText("±Ý¾×À» ÀÔ·ÂÇϼ¼¿ä"); // ÇÁ·ÒÇÁÆ® ÅؽºÆ® ¼³Á¤
        
        // ³»¿ª ÀÔ·Â TextField
        TextField descriptionField = new TextField();
        descriptionField.setPromptText("³»¿ªÀ» ÀÔ·ÂÇϼ¼¿ä"); // ÇÁ·ÒÇÁÆ® ÅؽºÆ® ¼³Á¤
        
        // ÀúÀå ¹öÆ°
        Button saveButton = new Button("ÀúÀå");
        saveButton.setOnAction(e -> {
            // TODO: ÀÔÃâ±Ý ³»¿ª ÀúÀå ·ÎÁ÷ Ãß°¡
            System.out.println("³¯Â¥: " + dateLabel.getText()); // ÀÔ·ÂµÈ ³¯Â¥ Ãâ·Â
            System.out.println("±Ý¾×: " + amountField.getText()); // ÀÔ·ÂµÈ ±Ý¾× Ãâ·Â
            System.out.println("³»¿ª: " + descriptionField.getText()); // ÀÔ·ÂµÈ ³»¿ª Ãâ·Â
            transactionStage.close(); // ⠴ݱâ
        });

        // VBox¿¡ ÄÄÆ÷³ÍÆ® Ãß°¡
        vbox.getChildren().addAll(dateLabel, amountField, descriptionField, saveButton);

        // »õ âÀÇ Scene ¼³Á¤
        Scene scene = new Scene(vbox, 300, 200); // »õ âÀÇ Å©±â ¼³Á¤
        transactionStage.setScene(scene); // SceneÀ» »õ â¿¡ ¼³Á¤
        transactionStage.show(); // »õ â Ç¥½Ã
    }
}

3. CSS ÆÄÀÏ (styles.css)

.calendar-title {
    -fx-font-size: 24px; /* Á¦¸ñ ÆùÆ® Å©±â */
    -fx-font-weight: bold; /* Á¦¸ñ ÆùÆ® µÎ²² */
    -fx-alignment: center; /* ÅؽºÆ® °¡¿îµ¥ Á¤·Ä */
    -fx-text-fill: #333; /* ÅؽºÆ® »ö»ó */
    -fx-padding: 10; /* Æеù ¼³Á¤ */
}

.calendar-grid {
    -fx-background-color: #f2f2f2; /* GridPane ¹è°æ»ö */
    -fx-padding: 10; /* Æеù ¼³Á¤ */
}

.date-label {
    -fx-background-color: #ffffff; /* ³¯Â¥ Label ¹è°æ»ö */
    -fx-border-color: #ccc; /* Å׵θ® »ö»ó */
    -fx-border-width: 1px; /* Å׵θ® µÎ²² */
    -fx-padding: 10; /* Æеù ¼³Á¤ */
    -fx-font-size: 16px; /* ³¯Â¥ Label ÆùÆ® Å©±â */
    -fx-min-width: 50px; /* ÃÖ¼Ò ³Êºñ */
    -fx-min-height: 50px; /* ÃÖ¼Ò ³ôÀÌ */
    -fx-alignment: center; /* ÅؽºÆ® °¡¿îµ¥ Á¤·Ä */
    -fx-cursor: hand; /* ¸¶¿ì½º Ä¿¼­¸¦ ¼Õ ¸ð¾çÀ¸·Î º¯°æ */
}

.date-label:hover {
    -fx-background-color: #eee; /* ¸¶¿ì½º È£¹ö ½Ã ¹è°æ»ö º¯°æ */
}

4. Main Ŭ·¡½º (Main.java)

package your.package;

import javafx.application.Application; // JavaFX Application Ŭ·¡½º import
import javafx.fxml.FXMLLoader; // FXML ·Îµå Ŭ·¡½º import
import javafx.scene.Scene; // Scene Ŭ·¡½º import
import javafx.stage.Stage; // Stage Ŭ·¡½º import

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("calendar.fxml")); // FXML ÆÄÀÏ ·Îµå
        Scene scene = new Scene(loader.load()); // Scene »ý¼º
        primaryStage.setTitle("´Þ·Â ¿¹Á¦"); // â Á¦¸ñ ¼³Á¤
        primaryStage.setScene(scene); // SceneÀ» Stage¿¡ ¼³Á¤
        primaryStage.show(); // â Ç¥½Ã
    }

    public static void main(String[] args) {
        launch(args); // JavaFX ¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇà
    }
}

¼³¸í

  • °¢ Ŭ·¡½º¿Í ¸Þ¼Òµå¿¡ ´ëÇØ ¿Ö ÇÊ¿äÇÑÁö, ¾î¶² ±â´ÉÀ» ¼öÇàÇÏ´ÂÁö¿¡ ´ëÇÑ ÁÖ¼®À» Ãß°¡Çß½À´Ï´Ù.
  • CSS ÆÄÀÏ¿¡¼­´Â ´Ù¾çÇÑ UI ½ºÅ¸ÀÏÀ» Á¤ÀÇÇϸç, °¢ ½ºÅ¸ÀÏ ¼Ó¼ºÀÌ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö¿¡ ´ëÇÑ ¼³¸íÀ» Æ÷ÇÔÇß½À´Ï´Ù.
  • ÀÌ¿Í °°ÀÌ ÁÖ¼®À» Ãß°¡Çϸé Äڵ带 ÀÌÇØÇϱ⠽¬¿öÁö¸ç, À¯Áöº¸¼ö ¹× ÆÀ¿ø°úÀÇ Çù¾÷¿¡ µµ¿òÀÌ µË´Ï´Ù.
¼¼Á¾´ë¿ÕÀ̵µ±Û¾´ÀÌ 2024-08-21 (¼ö) 20:13
label.setOnMouseClicked(event -> openTransactionWindow(currentDate.getYear(), currentDate.getMonthValue(), day)); ¿À·ù°¡ Àִµ¥?
     
       
AIê 2024-08-21 (¼ö) 20:13
@¼¼Á¾´ë¿ÕÀ̵µ

label.setOnMouseClicked(...)ÀÇ ¿À·ù¸¦ ÇØ°áÇÏ·Á¸é, À̺¥Æ® Çڵ鷯¿¡¼­ »ç¿ëµÇ´Â º¯¼öµéÀÌ ¿Ã¹Ù¸£°Ô Á¤ÀǵǾú´ÂÁö È®ÀÎÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¹®Á¦´Â ÀϹÝÀûÀ¸·Î À̺¥Æ® Çڵ鷯°¡ Á¤ÀÇµÈ Å¬·¡½º ³»¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Â ¹üÀ§¿¡ º¯¼ö¸¦ ÂüÁ¶ÇÏ·Á°í ÇÒ ¶§ ¹ß»ýÇÕ´Ï´Ù.

¾Æ·¡´Â ¿À·ù¸¦ ¹æÁöÇϱâ À§ÇÑ ¸î °¡Áö È®ÀÎ »çÇ×°ú ¼öÁ¤ »çÇ×ÀÔ´Ï´Ù:

  1. ÇöÀç ³¯Â¥ ÀνºÅϽº À¯Áö: currentDate º¯¼ö°¡ ¿Ã¹Ù¸£°Ô ÃʱâÈ­µÇ¾î ÀÖ°í, ÇØ´ç Ŭ·¡½º ³»¿¡¼­ Á¢±Ù °¡´ÉÇÑÁö È®ÀÎÇÕ´Ï´Ù.

  2. JavaFX ¶óÀ̺귯¸® È®ÀÎ: JavaFX ¶óÀ̺귯¸®¿Í ȯ°æÀÌ ¿Ã¹Ù¸£°Ô ¼³Á¤µÇ¾î ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù.

  3. Á¤Àû Á¢±Ù ¿À·ù: ¸¸¾à openTransactionWindow ¸Þ¼Òµå°¡ Á¤Àû ¸Þ¼ÒµåÀÏ °æ¿ì, ÀνºÅϽº º¯¼ö¸¦ ÂüÁ¶ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ °æ¿ì, ÀûÀýÇÏ°Ô ÀνºÅϽº ¸Þ¼Òµå¸¦ È£ÃâÇϵµ·Ï º¯°æÇØ¾ß ÇÕ´Ï´Ù.

  4. ½ºÄ³³Ê³ª ¶÷´Ù Ç¥Çö½ÄÀÌ Á¦´ë·Î ÀÌÇصǾú´ÂÁö: C#°ú ºñ½ÁÇÑ ¾ð¾î¿¡¼­´Â ÀÌ·¯ÇÑ ¶÷´Ù Ç¥Çö½ÄÀÌ ´õ Á÷°üÀûÀÌÁö¸¸, Java¿¡¼­ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ Àß ¾Ë°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.

¼öÁ¤µÈ ¿¹Á¦: ÀÌ Äڵ带 ±âÁØÀ¸·Î openTransactionWindow ¸Þ¼Òµå¸¦ ¿À·ù°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï Á¤ÀÇÇØ º¸°Ú½À´Ï´Ù.

Controller.java ¼öÁ¤ ¿¹Á¦

private void updateCalendar() {
    calendarGrid.getChildren().clear(); // ÀÌÀü ³¯Â¥ Label Á¦°Å
    YearMonth yearMonth = YearMonth.from(currentDate); // ÇöÀç ¿¬µµ¿Í ¿ù °¡Á®¿À±â
    int daysInMonth = yearMonth.lengthOfMonth(); // ÇöÀç ¿ùÀÇ ÃÑ ³¯Â¥ ¼ö
    LocalDate firstDayOfMonth = yearMonth.atDay(1); // ÇöÀç ¿ùÀÇ Ã¹Â° ³¯
    int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue(); // ù° ³¯ÀÇ ¿äÀÏ(1=¿ù¿äÀÏ ~ 7=ÀÏ¿äÀÏ)

    // °¢ ³¯Â¥ LabelÀ» GridPane¿¡ Ãß°¡Çϱâ
    for (int day = 1; day <= daysInMonth; day++) {
        Label label = new Label(String.valueOf(day)); // ³¯Â¥ Label »ý¼º
        label.getStyleClass().add("date-label"); // CSS ½ºÅ¸ÀÏ Àû¿ë

        // ³¯Â¥ Ŭ¸¯ À̺¥Æ® Çڵ鷯 Ãß°¡
        label.setOnMouseClicked(event -> {
            // Ŭ¸¯µÈ ³¯Â¥·Î °Å·¡ ÀԷ âÀ» ¿±´Ï´Ù
            openTransactionWindow(currentDate.getYear(), currentDate.getMonthValue(), day);
        });

        // GridPane¿¡ ³¯Â¥ ¹èÄ¡ (Çà°ú ¿­ °è»ê)
        int row = (day + firstDayOfWeek - 2) / 7; // Çà °è»ê
        int col = (day + firstDayOfWeek - 2) % 7; // ¿­ °è»ê
        calendarGrid.add(label, col, row); // GridPane¿¡ ³¯Â¥ Ãß°¡
    }

    // GridPane ¸®¼Â
    calendarGrid.requestLayout(); // ·¹À̾ƿô ¾÷µ¥ÀÌÆ® ¿äû
}

Ãß°¡ÀûÀÎ È®ÀÎ »çÇ×

  • FXML ¿¬°á È®ÀÎ: FXML ÆÄÀÏ¿¡¼­ controller°¡ ¿Ã¹Ù¸¥ package¿Í class À̸§À» ÂüÁ¶ÇÏ°í ÀÖ´ÂÁö È®ÀÎÇÕ´Ï´Ù.
  • JavaFX ȯ°æ: JavaFX°¡ Á¦´ë·Î ¼³Ä¡µÆ°í, ¶óÀ̺귯¸®µéÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö È®ÀÎÇϼ¼¿ä.
  • IDE ¼³Á¤: »ç¿ëÇÏ´Â IDE(¿¹: IntelliJ, Eclipse µî)ÀÇ ¼³Á¤ÀÌ ¿Ã¹Ù¸¥Áö È®ÀÎÇÕ´Ï´Ù.

ÀÌ ¸ðµç »çÇ×µéÀÌ È®ÀÎµÇ°í ¼öÁ¤µÇ¸é, Ŭ¸¯ À̺¥Æ®°¡ ¿Ã¹Ù¸£°Ô ÀÛµ¿ÇÏ°í ¿À·ù°¡ ¹ß»ýÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ¸¸¾à ¿©ÀüÈ÷ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù¸é, ±¸Ã¼ÀûÀÎ ¿À·ù ¸Þ½ÃÁö¸¦ ¾Ë·ÁÁÖ½Ã¸é ´õ Á¤È®ÇÑ µµ¿òÀ» µå¸± ¼ö ÀÖ½À´Ï´Ù.


 1  2  3  4  5  6  7  8  9  10  ´ÙÀ½

°øÀ¯Çϱâ

ÀÌÅä·£µå ·Î°í

°èÁ¤ ã±â ȸ¿ø°¡ÀÔ
¼Ò¼È·Î±×ÀÎ