Scala에서 FXML을로드하여 양식 응용 프로그램 만들기

8681 단어 GUIScalaFXML
이전에 "Scala fxml"을 검색했을 때 수동으로 이벤트 핸들러를 등록하고 다소 어려웠기 때문에 Scala에서 .fxml을 간단히 읽고 핸들러를 등록하기위한 기사를 작성했습니다.

흐름



할 일은 다음 세 가지입니다.
  • .fxml 파일 준비
  • 컨트롤러 쓰기
  • .fxml 파일을 읽고 컨트롤러 등록

  • import 문 등은 적절히 추가해 주세요.
    일단 GitHub 리포지토리 에 병아리형을 두고 있습니다.

    .fxml 파일 준비



    FXML 는, JavaFX 로 사용되는 GUI 의 마크 업 언어입니다.
    GLUON Scene Builder 등을 사용하면 매우 쉽게 GUI를 만들 수 있습니다.

    이번은 우선 이런 느낌의 폼으로 합니다.



    BorderPane 위에 Button과 Label이 있을 뿐입니다.
    응용 프로그램 만들기 그 자체가 목적이 아니기 때문에…
    내용은 이런 느낌입니다.

    main.fxml
    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.Label?>
    <?import javafx.scene.layout.BorderPane?>
    
    <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
       <left>
          <Button fx:id="button1" mnemonicParsing="false" onMouseClicked="#button1_MouseClicked" text="Button" BorderPane.alignment="CENTER" />
       </left>
       <center>
          <Label fx:id="label1" prefHeight="17.0" prefWidth="265.0" text="Label" BorderPane.alignment="CENTER" />
       </center>
    </BorderPane>
    
    fx:id라는 속성이 컨트롤을 포함하는 변수에 사용됩니다.onMouseClicked 등의 프로퍼티은, 이벤트 핸들러를 등록하기 전에 메소드명으로서 사용됩니다.

    컨트롤러 설정



    MainController.scala
    object MainController {
      @FXML
      private[this] var button1: Button = _
      @FXML
      private[this] var label1: Label = _
    
      @FXML
      private[this] def button1_MouseClicked(e: MouseEvent): Unit = {
        label1.setText("Hello, world!")
      }
    }
    

    이번에는 간단하게 버튼을 누르면 Label의 표시가 "Hello, world!"로 전환되도록 했습니다.
    @FXML 어노테이션을 붙이면 .fxml 파일을 읽을 때 변수가 주입되는 방식처럼 보입니다.
    변수 이름과 메서드 이름이 .fxml 파일의 속성에 해당합니다.

    FXML을 읽고 컨트롤러 설정



    Main.scala
    object Main extends App {
      Application.launch(classOf[Main], args: _*)
    }
    
    class Main extends Application {
      override def start(primaryStage: Stage): Unit = {
        val loader = new FXMLLoader(getClass.getResource("main.fxml"))
        loader.setController(MainController)
        val root: Parent = loader.load()
    
        val scene = new Scene(root, 800, 500)
        primaryStage.setTitle("GUI test")
        primaryStage.setScene(scene)
        primaryStage.show()
      }
    }
    

    중요한 것은 다음 두 줄입니다.
    val loader = new FXMLLoader(getClass.getResource("main.fxml"))
    loader.setController(MainController)
    

    첫 번째 줄에서 main.fxml을 읽고 두 번째 줄에서 컨트롤러를 설정합니다.
    이 쓰는 방법은 JDK8 이상에서만 유효합니다. 이전에 프로젝트 설정이 JDK7에 있다는 것을 깨닫지 못하고 영원히 형식이 해결되지 않아 고통 받았으므로주의하십시오.

    이제 폼의 외형을 만들고 이벤트 핸들러를 등록할 수 있었습니다.
    실제로 움직이면 다음과 같습니다. 제대로 실행되고 있습니다.



    결론



    그래서 Scala Advent Calendar 2 일째였습니다. 수수한 기사입니다.
    아직 시작되었을 뿐입니다만, 개인적으로는 Spark라든지 기계 학습의 기사가 기대됩니다!

    좋은 웹페이지 즐겨찾기