JavaFX 속성 바인딩

15075 단어 JavaFXJava

JavaFX의 개요


Java7에서 사용할 데스크톱 UI입니다.
FXML의 GUI로 구성된 기술이나 CSS의 디자인 분리, 프라임으로 불리는 하드웨어 가속에 대응하는 그리기 엔진, 웹킷 기반 브라우저를 탑재한 것이 특징이지만 자바계 밖에서는 전혀 모르는 느낌이다.

그래프를 비롯해 GUI 부품이 모두 갖추어져 있고 애니메이션용 타임라인도 있다.
그러나 대화 상자도, 화면 이동용 API도 없고, 값을 입력하는 검증 기능도 없어 부족한 부분은 직접 만들어야 한다.이 말들을 더 쓰고 싶으면 쓰고, 이 기사에는 자바FX의 기본과 속성 귀속에 대해 쓰겠습니다.

JavaFX 작업 단계


화면의 제작 방법은 다음과 같이 나눌 수 있다.
  • FXML을 사용한 화면 구조
  • API를 사용한 동적 생성

  • FXML은 편집으로 기술할 수 있지만 Scene Builder라는 도구를 사용하는 것이 비교적 편리하다.유지보수와 다중 개발을 고려하면 직접 기술하는 것을 추천하지 않습니다.
    동적으로 생성하려면 API를 사용해야 하지만 어셈블리 단위별로 Scene Builder를 사용하여 만든 다음 API로 포함해야 합니다.
    FXML에 관련 클래스를 기록합니다.그런 다음 FXML을 읽을 때 자동으로 생성됩니다.제작은 안 봤지만 컨테이너가 관리했나 봐요.
    Scene.fxml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
    
    <AnchorPane id="AnchorPane"
                prefHeight="200"
                prefWidth="320"
                xmlns:fx="http://javafx.com/fxml/1"
                xmlns="http://javafx.com/javafx/8"
                fx:controller="com.exsample.javafxsample.FXMLController">
        <children>
            <Label fx:id="label" layoutX="77.0" layoutY="51.0" minHeight="16" minWidth="69" text="Label" />
            <Button layoutX="79.0" layoutY="108.0" onAction="#onAction" text="Button" />
            <TextField fx:id="nameField" layoutX="79.0" layoutY="75.0" />
        </children>
    </AnchorPane>
    
    자바는 이렇게 편리한 구조를 모방하기 때문에 GUI 위젯과 한 번 연결됩니다.
    FXMLController.java
    package com.exsample.javafxsample;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.Label;
    import javafx.scene.control.TextField;
    
    public class FXMLController implements Initializable {
    
        @FXML
        private Label label;
        @FXML
        private TextField nameField;
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
        }    
    
        @FXML
        private void onAction(ActionEvent event) {
            label.setText(nameField.getText());
        }
    
    }
    
    MainApp.java
    package com.exsample.javafxsample;
    
    import javafx.application.Application;
    import static javafx.application.Application.launch;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    public class MainApp extends Application {
    
        @Override
        public void start(Stage stage) throws Exception {
            Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml"));
            Scene scene = new Scene(root);
            scene.getStylesheets().add("/styles/Styles.css");
            stage.setTitle("JavaFX and Maven");
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
    }
    

    반드시 기억해야 할 속성 귀속


    시뮬레이션을 통해 GUI 위젯에 대한 속성을 읽고 설정할 수 있지만, 어떤 프로그램이든 모델과 보기를 분리하려고 합니다.
    그리고 모형을 분리할 때 GUI 부품에 대해 일일이 Set/Get을 하는 것은 보기 싫기 때문에 이렇게 하지 마십시오.속성 귀속 메커니즘이 있다.모델의 값이 변경되면 뷰도 변경되고 UI를 입력하면 모델의 값도 변경됩니다.
    참고로 이 모델은 귀속을 지연시키는 코드입니다.
    모형은 JAXB와 XML로 서로 변환되며 O/R 매핑 시 귀속을 지연시킵니다.
    Modle.java
    package com.exsample.javafxsample;
    
    import java.util.Objects;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    
    public class Model {
    
        private StringProperty valueProperty = null;
        private String value;
    
        public StringProperty valueProperty() {
            if (Objects.isNull(valueProperty)) {
                valueProperty = new SimpleStringProperty(value);
            }
            return valueProperty;
        }
    
        public String getValue() {
            if (Objects.nonNull(valueProperty)) {
                return valueProperty.get();
            }
            return value;
        }
    
        public void setValue(String value) {
            if (Objects.nonNull(valueProperty)) {
                valueProperty.set(value);
            } else {
                this.value = value;
            }
        }
    
    }
    
    컨트롤러 클래스를 덮어씁니다.
    버튼 역할을 무시하고 텍스트를 입력한 후 레이블을 업데이트합니다.
    FXMLController.java
    public class FXMLController implements Initializable {
    
        private final Model model = new Model();
        @FXML
        private Label label;
        @FXML
        private TextField nameField;
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            label.textProperty().bind(model.valueProperty());
            model.valueProperty().bind(nameField.textProperty());
        }    
    
        @FXML
        private void onAction(ActionEvent event) {
        }
    
    }
    
    실행 예.

    좋은 웹페이지 즐겨찾기