如何在JavaFX中从SceneBuilder访问UI组件

Mar*_*fer 5 javafx

(重复并解决-参见下面的答案)

我正在JavaFX中迈出第一步,似乎很难使用“ SceneBuilder”。我已经习惯了Android和QtCreator。在我看来,访问UI组件要容易得多。

类似于findViewById(R.id.btnPushMe);<-Android代码

实际上我有一个解决方案,但是使用起来非常不舒服。看起来像这样:

FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("../fmxl/main.fxml"));

AnchorPane pane = loader.load();
System.out.println("panechilds:" + pane.getChildren().size());

BorderPane border = (BorderPane) pane.getChildren().get(0);
System.out.println("borderchilds:" + border.getChildren().size());
Run Code Online (Sandbox Code Playgroud)

xml ..

<AnchorPane fx:id="mAnchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0"
            xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.progui.MainController">
    <children>
        <BorderPane layoutX="-1.0" prefHeight="600.0" prefWidth="800.0">
            <top>

               ...
Run Code Online (Sandbox Code Playgroud)

预先感谢马丁

编辑:

这是一个重复的问题(但是我不会删除它,因为我花了一些时间来找到答案-也许是因为JavaFX的询问不如Android问题多。)

AnchorPane anchor = (AnchorPane) scene.lookup("#mAnchor");
Run Code Online (Sandbox Code Playgroud)

在这里找到:如何在JavaFX中查找具有ID的元素?

Jam*_*s_D 5

您应该使用控制器类并在那里访问UI元素。

基本上,您会这样做:

<AnchorPane fx:id="mAnchor" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0"
            xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.progui.MainController">
    <children>
        <BorderPane fx:id="border" layoutX="-1.0" prefHeight="600.0" prefWidth="800.0">
            <top>

               ...
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下命令访问fx:id控制器中的-attributed元素

package app.progui ;

// ...

public class MainController {

    @FXML
    private BorderPane border ;


    public void initialize() {
        border.setStyle("-fx-background-color: antiquewhite;");
        // ...
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

控制器类中的字段名称必须与fx:idFXML文件中的值匹配。

可以fx:id在调用的类中访问-attributed元素FXMLLoader,但是如果您需要这样做,通常表明您的总体设计是错误的。你可以做:

FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("../fmxl/main.fxml"));

AnchorPane pane = loader.load();
Map<String, Object> fxmlNamespace = loader.getNamespace();
BorderPane border = (BorderPane) fxmlNamespace.get("border");
Run Code Online (Sandbox Code Playgroud)

假设fx:id上面截断了FXML中的定义。