JavaRush /Java Blog /Random-KO /Java FX 소개

Java FX 소개

Random-KO 그룹에 게시되었습니다
어느 날 나는 내 필요에 맞는 작은 데스크톱 응용 프로그램(외국어 학습을 위한 작은 사전과 같은)을 작성해야겠다는 생각이 들었고 머리가 아프기 시작했습니다. 어떻게 이것을 할 수 있습니까? 당연히 가장 먼저 떠오르는 것은 스윙이었습니다. 누구나 Swing 에 대해 들어봤을 것입니다 . 사용자 그래픽 인터페이스를 생성하기 위한 라이브러리입니다. 우리가 사랑하는 Oracle이 아직 Swing을 완전히 포기하지 않았기 때문에 더 이상 사용되지 않는 것으로 간주되지 않으며 애플리케이션이 여전히 Swing에서 실행됩니다. 그러나 더 이상 Swing에 의해 현대화되지 않으며 Oracle 직원이 JavaFX의 미래를 맛보게 했습니다. 그리고 실제로 JavaFX는 Swing 구성요소를 서비스 제공자로 사용합니다.)

JavaFX란 무엇입니까?

JavaFX는 기본적으로 Java용 GUI 툴킷입니다. 여기서는 약간의 여담이 있을 것이며 GUI가 무엇인지 기억해 보겠습니다 . 그래픽 사용자 인터페이스 - 그래픽 사용자 인터페이스는 모든 요소(버튼, 메뉴, 아이콘, 목록)가 화면에서 사용자에게 표시되는 사용자 인터페이스 유형입니다. 디스플레이는 그림, 그래픽의 형태로 이루어집니다. 명령줄 인터페이스와 달리 GUI에서는 사용자가 입력 장치를 사용하여 표시되는 개체에 무작위로 액세스할 수 있습니다. 인터페이스 요소는 메타포 형식으로 구현되는 경우가 많으며 사용자의 이해를 돕기 위해 해당 속성과 목적을 표시합니다. JavaFX 는 Java로 게임과 데스크톱 애플리케이션을 만드는 것을 목표로 합니다. 실제로 이는 Java용으로 제안된 새로운 GUI 도구로 인해 Swing을 대체하게 됩니다. 또한 웹 애플리케이션에서 익숙한 것과 유사하게 GUI 레이아웃 파일(XML)의 스타일을 지정하고 CSS를 사용하여 더욱 우아하게 만들 수 있습니다. JavaFX는 단일 GUI 툴킷에서 통합 3D 그래픽은 물론 오디오, 비디오 및 임베디드 네트워킹 애플리케이션도 추가로 처리합니다. 배우기 쉽고 잘 최적화되어 있습니다. Windows, UNIX 시스템 및 Mac OS뿐만 아니라 다양한 운영 체제를 지원합니다. Java FX 소개 - 3

JavaFX 기능:

  • JavaFX는 처음에 모든 종류의 버튼, 텍스트 필드, 테이블, 트리, 메뉴, 차트 등과 같은 대규모 그래픽 인터페이스 부분 세트와 함께 제공되므로 결과적으로 많은 시간을 절약할 수 있습니다.
  • JavaFX는 종종 CSS 스타일을 사용하므로 Java 코드에서 수행하는 대신 특수 FXML 형식을 사용하여 GUI를 생성할 수 있습니다. 이를 통해 오랫동안 Java 코드를 가지고 놀지 않고도 GUI를 신속하게 배치하거나 모양이나 구성을 변경할 수 있습니다.
  • JavaFX에는 즉시 사용할 수 있는 다이어그램 부분이 있으므로 기본 다이어그램이 필요할 때마다 처음부터 작성할 필요가 없습니다.
  • JavaFX에는 3D 그래픽 지원도 함께 제공되는데, 이는 일종의 게임이나 유사한 애플리케이션을 개발할 때 종종 유용합니다.
창의 주요 구성요소를 조금 살펴보겠습니다.
  • 스테이지는 기본적으로 시작 캔버스 역할을 하고 나머지 구성 요소를 포함하는 주변 창입니다. 애플리케이션에는 여러 단계가 있을 수 있지만 어떤 경우에도 그러한 구성 요소는 하나만 있어야 합니다. 기본적으로 Stage는 기본 컨테이너이자 진입점입니다.
  • 장면 - 무대의 내용을 표시합니다 (중첩 인형처럼). 각 단계에는 서로 전환할 수 있는 여러 구성요소(장면)가 포함될 수 있습니다. 내부적으로 이는 장면 그래프(각 요소는 노드라고도 함 ) 라는 개체 그래프에 의해 구현됩니다.
  • 노드는 레이블 버튼이나 레이아웃과 같은 컨트롤이며 내부에 여러 개의 중첩된 구성 요소가 있을 수 있습니다. 각 장면에는 하나의 중첩 노드가 있을 수 있지만 여러 구성 요소가 있는 레이아웃일 수도 있습니다. 중첩은 다른 레이아웃과 일반 구성요소를 포함하는 레이아웃을 사용하여 다단계일 수 있습니다. 이러한 각 노드에는 고유한 식별자, 스타일, 효과, 상태 및 이벤트 핸들러가 있습니다.
Java FX 소개 - 4 이제 코드쪽으로 조금 이동해 보겠습니다. Java 8을 사용하기 때문에 JavaFx는 기본적으로 JDK에 있으므로(Java 9.10에서와 같이) 종속성을 가져올 필요가 없습니다. 그러나 Java 11+가 있는 경우에는 maven 저장소로 이동하여 종속성에서 끌어옵니다.

JavaFX: 사용 예

main메소드 (진입점)를 사용하여 일반 클래스를 만듭니다 .
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
여기에서 우리 클래스는 javafx.application.ApplicationBugaga 상자에서 상속받았습니다. 기본적으로 정적 Application 메서드를 호출하여 launch()창을 시작합니다. start또한 우리의 아이디어는 우리 가 궁극적으로 수행하는 Application 메서드를 구현하지 않았다고 불평할 것입니다 . 그것은 무엇을 위한 것입니까? 그리고 속성(창의 기능)을 관리할 수 있도록 하기 위해서입니다. 이를 위해 우리는 primaryStage메소드를 호출하는 수신 인수를 사용하여 show에서 창이 시작되는 것을 볼 수 있습니다 main. 우리의 방법을 조금 작성해 봅시다 start:
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Dogs application");
    primaryStage.setWidth(500);
    primaryStage.setHeight(400);

    InputStream iconStream =
    getClass().getResourceAsStream("/images/someImage.png");
    Image image = new Image(iconStream);
    primaryStage.getIcons().add(image);

    Button button = new Button("WOF WOF ???'");

    button.setOnAction(e -< {
      Alert alert = new Alert(Alert.AlertType.INFORMATION, "WOF WOF WOF!!!");
        alert.showAndWait();
    });
    Scene primaryScene = new Scene(button);
    primaryStage.setScene(primaryScene);

    primaryStage.show();
}
그럼 우리는 여기서 무엇을 볼 수 있나요? 한 줄씩 살펴보겠습니다. 2 - 창 자체의 이름 설정(단계) 3.4 - 크기 설정 6.7 - 읽기 스트림 경로를 파일(아이콘)로 설정 Java FX 소개 - 58 - 파일을 이미지 개체로 생성 생성자에 전달된 스트림에 의해 실제 파일에 연결됩니다. 9 - 창 상단 패널에 아이콘 설정 11 - 버튼 객체 생성 13-16 - 버튼을 눌렀을 때 반응 설정 17 - 장면 생성 버튼 18을 배치합니다 - 장면을 공통 창에 배치합니다. 20 - 창에 대한 가시성 플래그를 설정합니다. 결과적으로 우리가 가장 좋아하는 페셀을 환영하는 작은 창이 생깁니다. Java FX 소개 - 6모든 것이 Swing보다 훨씬 단순해 보입니다. 그렇지 않습니까? 하지만 아직 끝나지 않았습니다. 애플리케이션을 표시하기 위해 모든 코드를 작성하는 것은 좋지 않습니다. 더 이해하기 쉽도록 어떻게든 나누어야 합니다(한 바구니에는 그래픽 구성 요소, 다른 바구니에는 논리). 그리고 여기에 XML이 등장합니다 ... 맙소사, xml? 정확히. 특히, 우리는 애플리케이션의 그래픽 구성 요소와 해당 속성(모든 종류의 크기 등)을 정의하는 JavaFX - FXML에 대한 특정 구현을 사용하고 이를 컨트롤러에 연결하여 로직을 관리하는 데 도움을 줍니다. 이 xml의 예를 살펴보겠습니다.
<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx"  xmlns:fx="http://javafx.com/fxml"
   id="Dogs application" prefHeight="200" prefWidth="300" alignment="center">

  <Label text="Wow wow?"/>

  <Button fx:id="mainButton" text="Greeting" onAction="buttonClicked()"/>

    <fx:script>
       function buttonClicked() {
            mainButton.setText("Wow wow wow!!!")
       }
    </fx:script>
</VBox>
2 - 우리가 사용하는 스크립팅 언어 4-6 - 가져온 데이터 8-9 Vbox - 하위 구성 요소를 한 줄에 배치하는 컨테이너입니다. 11 - 일부 텍스트 표시 13 - 버튼을 클릭하면 스크립트의 15-18행에 설명된 메서드를 사용합니다. 메서드에 이 xml 파일을 호출하는 코드가 있어야 하지만 start지금은 그다지 중요하지 않으며, 생략합니다(아래에는 이 파일을 가져오는 예가 나와 있습니다). 따라서 xml은 물론 훌륭하지만(매우 좋지는 않음) 수동으로 작성하는 것은 매우 혼란스럽습니다. 지난 세기가 아닌가요? Java FX 소개 - 7

JavaFX SceneBuilder 소개

이 시점에서 (드럼 롤)이 작동합니다. SceneBuilder JavaFX에서 Scene Builder 는 창을 그래픽 인터페이스 형태로 디자인한 다음 저장할 수 있는 도구이며, 이 프로그램은 결과에 따라 우리는 애플리케이션에서 이를 개선할 xml 파일을 구성합니다. 이 fmxl 빌더의 인터페이스는 다음과 같습니다. Java FX 소개 - 8

작은 여담. JavaFX 수업

설치 세부 사항은 건너뛰고 이 도구에 대한 자세한 연구도 진행하겠습니다. 이는 더 자세히 살펴볼 가치가 있는 주제입니다. 따라서 JavaFX 레슨에 대한 몇 가지 흥미로운 링크를 남겨두겠습니다. 하나 (JavaFX에 대한 온라인 튜토리얼)와 두 개 (또 다른 좋은 튜토리얼)입니다. 제가 스케치한 작은 예를 살펴보겠습니다. 결국 나는 다음과 같은 것을 얻었습니다. Java FX 소개 - 9
(일종의 개 등록 창구와 같습니다)
개를 선택하고 삭제 버튼을 누르면 해당 개가 목록에서 제거됩니다. 네발 달린 친구를 선택하고 필드를 변경한 후 편집 버튼을 누르면 해당 강아지의 정보가 업데이트됩니다. 새로 만들기 버튼을 누르면 새 개에 대한 기록을 생성하기 위한 창이 나타납니다(이름으로 시작). Java FX 소개 - 10그런 다음 저장을 클릭하고 첫 번째 창에서 나머지 필드를 채운 다음 편집 버튼을 클릭하여 구하다. 쉬운 것 같죠? 이것이 Java 애플리케이션에서 어떻게 보이는지 살펴보겠습니다. 먼저 다음에서 생성된 두 창에 대한 xml 레이아웃을 여기에 남겨 두겠습니다 SceneBuilder. 첫 번째(기본):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.BaseController">
   <children>
      <SplitPane dividerPositions="0.29797979797979796" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <TableView fx:id="dogs" layoutX="-2.0" layoutY="-4.0" prefHeight="307.0" prefWidth="190.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="-2.0" AnchorPane.rightAnchor="-13.0" AnchorPane.topAnchor="-4.0">
                    <columns>
                      <TableColumn fx:id="nameList" prefWidth="100.33334350585938" text="Nickname" />
                    </columns>
                     <columnResizePolicy>
                        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TableView>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <Label layoutX="49.0" layoutY="25.0" text="Person Details" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" />
                  <GridPane accessibleText="erreererer" gridLinesVisible="true" layoutX="5.0" layoutY="31.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="31.0">
                    <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Label prefHeight="17.0" prefWidth="70.0" text="Nickname" />
                        <Label text="Breed" GridPane.rowIndex="1" />
                        <Label text="Age" GridPane.rowIndex="2" />
                        <Label text="City" GridPane.rowIndex="3" />
                        <Label text="Level of training" GridPane.rowIndex="4" />
                        <TextField fx:id="breed" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                        <TextField fx:id="age" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                        <TextField fx:id="city" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                        <TextField fx:id="levelOfTraining" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                        <TextField fx:id="name" GridPane.columnIndex="1" />
                     </children>
                  </GridPane>
                  <Button layoutX="251.0" layoutY="259.0" mnemonicParsing="false" onAction="#create" text="New" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="230.0" AnchorPane.rightAnchor="130.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="316.0" layoutY="262.0" mnemonicParsing="false" onAction="#edit" text="Edit" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="290.0" AnchorPane.rightAnchor="70.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="360.0" layoutY="262.0" mnemonicParsing="false" onAction="#delete" text="Delete" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="350.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="260.0" />
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>
두 번째(새 강아지 생성):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.NewDogController">
   <children>
      <GridPane layoutX="31.0" layoutY="25.0" prefHeight="122.0" prefWidth="412.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="185.0" minWidth="10.0" prefWidth="149.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="173.0" minWidth="10.0" prefWidth="146.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label prefHeight="48.0" prefWidth="178.0" text="Please, write name:">
               <font>
                  <Font size="20.0" />
               </font>
            </Label>
            <TextField fx:id="nickName" prefHeight="36.0" prefWidth="173.0" GridPane.columnIndex="1" />
         </children>
      </GridPane>
      <Button layoutX="222.0" layoutY="149.0" mnemonicParsing="false" onAction="#ok" prefHeight="37.0" prefWidth="95.0" text="Save" />
      <Button layoutX="325.0" layoutY="149.0" mnemonicParsing="false" onAction="#cansel" prefHeight="37.0" prefWidth="95.0" text="Cansel" />
   </children>
</AnchorPane>
폴더 구조의 모습: Java FX 소개 - 11보시다시피 특별한 것은 없으며 특정 창을 나타내는 컨트롤러가 있고 데이터를 나타내는 모델이 있습니다. 애플리케이션을 시작하는 클래스(애플리케이션 구현)를 살펴보겠습니다. @Data
public class AppFX extends Application {

    private Stage primaryStage;
    private AnchorPane rootLayout;
    private ObservableList listDog = FXCollections.observableArrayList();

    public AppFX() {
        listDog.add(new Dog("Fluffy", "Pug", 8, "Odessa", 2));
        listDog.add(new Dog("Archie", "Poodle", 3, "Lviv", 6));
        listDog.add(new Dog("Willie", "Bulldog", 5, "Kiev", 4));
        listDog.add(new Dog("Hector", "Shepherd", 9, "Minsk", 6));
        listDog.add(new Dog("Duncan", "Dachshund", 1, "Hogwarts", 9));
    }
여기서는 초기 데이터(특수 시트인 ObservableList에 저장함)를 채울 생성자를 볼 수 있습니다.
public static void main(String[] args) {
        Application.launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Dogs application");
        showBaseWindow();
}
특별한 것은 없으며 애플리케이션을 실행하는 main구현은 다음과 같습니다 .start()
public void showBaseWindow() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/rootWindow.fxml"));
            rootLayout = loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            InputStream iconStream = getClass().getResourceAsStream("/icons/someImage.png");
            Image image = new Image(iconStream);
            primaryStage.getIcons().add(image);
            BaseController controller = loader.getController();
            controller.setAppFX(this);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
여기서는 실제로 에서 실행하는 메서드 start(), 즉 기본 창의 설정을 지정하는 메서드를 확인합니다. 예를 들어 리소스의 xml 레이아웃에서 아이콘 제공, 특정 컨트롤러에 연결, 컨트롤러에 this클래스에 대한 링크 제공)
public void showCreateWindow(Dog dog) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/new.fxml"));
            AnchorPane page = loader.load();
            Stage dialogStage = new Stage();
            dialogStage.setTitle("Wow Wow Wow");
            dialogStage.initModality(Modality.WINDOW_MODAL);
            dialogStage.initOwner(primaryStage);
            dialogStage.setScene(new Scene(page));
            CreateController controller = loader.getController();
            controller.setDialogStage(dialogStage);
            controller.setDog(dog);
            dialogStage.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
여기서는 두 번째 창, 즉 새 기록(새 개 이름)을 생성하는 창의 모양을 담당하는 방법을 볼 수 있습니다. 또한 컨트롤러, xml 레이아웃, 스테이지 등을 설정합니다. 우리가 고려할 다음 클래스는 개(개에 대한 정보)를 나타내는 모델이 될 것입니다. @Data
public class Dog {

    private StringProperty name;
    private StringProperty breed;
    private IntegerProperty age;
    private StringProperty city;
    private IntegerProperty levelOfTraining;

    public Dog(String name, String breed, int age, String city, int levelOfTraining) {
        this.name = new SimpleStringProperty(name);
        this.breed = new SimpleStringProperty(breed);
        this.age = new SimpleIntegerProperty(age);
        this.city = new SimpleStringProperty(city);
        this.levelOfTraining = new SimpleIntegerProperty(levelOfTraining);
    }

    public Dog() {
        name = new SimpleStringProperty();
        breed = null;
        age = null;
        city = null;
        levelOfTraining = null;
    }
}
여기에는 두 개의 생성자가 있습니다. 하나는 모든 인수가 있는 거의 일반적인 생성자(거의 간단한 유형의 특수 FX 래퍼를 사용하기 때문입니다)와 인수가 없는 생성자입니다. 처음에는 새 개를 만들 때 사용합니다. 이름. 기본 창용 컨트롤러: @Data
public class BaseController {

    @FXML
    private TableView dogs;
    @FXML
    private TableColumn nameList;
    @FXML
    private TextField name;
    @FXML
    private TextField breed;
    @FXML
    private TextField age;
    @FXML
    private TextField city;
    @FXML
    private TextField levelOfTraining;
    private AppFX appFX;
여기서는 개체 필드를 볼 수 있지만 TextField 형식입니다. 텍스트 입력 필드를 나타내는 형식입니다. @FXML은 Java 코드와 레이아웃의 해당 객체(버튼, 필드 등)를 연결하도록 설계된 주석입니다.
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
여기 목록 오른쪽에 개 이름을 표시하는 방법이 있습니다(해당 @FXML 주석은 JavaFX TableView 레이아웃 구성 요소에 바인딩됩니다).
public void setAppFX(AppFX appFX) {
    this.appFX = appFX;
    dogs.setItems(appFX.getListDog());
}

private void showDogsInformation(Dog dog) {
    if (dog != null) {
        name.setText(dog.getName() != null ? dog.getName().getValue() : null);
        breed.setText(dog.getBreed() != null ? dog.getBreed().getValue() : null);
        age.setText(dog.getAge() != null ? String.valueOf(dog.getAge().get()) : null);
        city.setText(dog.getCity() != null ? dog.getCity().getValue() : null);
        levelOfTraining.setText(dog.getLevelOfTraining() != null ? String.valueOf(dog.getLevelOfTraining().get()) : null);
    } else {
        name.setText("");
        breed.setText("");
        age.setText("");
        city.setText("");
        levelOfTraining.setText("");
    }
}
첫 번째 메서드에서는 Application을 구현하는 클래스에 대한 내부 참조를 설정하고(두 번째 창을 호출하기 위해 해당 메서드를 호출할 수 있도록) 표시할 초기 목록을 설정하는 것을 볼 수 있습니다. 두 번째는 현재 개에 특정 데이터가 있는지 확인하고 이를 기반으로 텍스트 필드를 설정합니다.
@FXML
    private void delete() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().remove(selectedIndex);
    }

    @FXML
    private void edit() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().set(selectedIndex, new Dog(name.getText(), breed.getText(), Integer.valueOf(age.getText()), city.getText(), Integer.valueOf(levelOfTraining.getText())));
    }

    @FXML
    private void create() {
        Dog someDog = new Dog();
        appFX.showCreateWindow(someDog);
        if (someDog.getName() != null && !someDog.getName().getValue().isEmpty()) {
            appFX.getListDog().add(someDog);
        }
    }
}
여기서는 버튼과 관련된 기본 창의 세 가지 메서드를 볼 수 있습니다. Java FX 소개 - 12
  • 삭제 — 선택한(선택한) 개를 색인별로 삭제합니다.
  • 편집 - 전송된 데이터로 새 개를 만들고 이전 개 대신 설정합니다.
  • 생성 - 새 개를 생성하고 생성 창을 호출하는 메서드를 호출하고 새 개체를 전달한 다음 닫은 후 이름이 null이 아니면 새 애완동물을 저장합니다.
계속해서 개를 생성하기 위한 윈도우 컨트롤러는 다음과 같습니다. @Data
public class CreateController {
    private Stage dialogStage;
    private Dog dog;

    @FXML
    private TextField nickName;

    @FXML
    private void ok() {
        if (nickName != null && !nickName.getText().isEmpty()) {
            dog.setName(new SimpleStringProperty(nickName.getText()));
            dialogStage.close();
        }
    }

    @FXML
    private void cansel() {
        dialogStage.close();
    }
}
여기서는 창의 텍스트 필드와의 연결, 저장 및 취소 버튼을 처리하여 창을 닫는 것을 볼 수 있습니다. 보시다시피, 저는 작은 애플리케이션의 편의성을 높이기 위해 Lombok을 사용했습니다. 그렇지 않으면 코드가 너무 많이 늘어나서 리뷰에 적합하지 않았을 것입니다. 오늘은 그게 아마 전부일 것 같아요. 오늘 우리는 JavaFX 사용의 기본 개념과 예제에 대해 간략하게 알아보았으며 (다행히 인터넷에 풍부한 추가 정보를 사용하여) 작은 데스크톱 응용 프로그램을 구축할 수 있습니다. 그리고 당신은 차례로)))
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION