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

标签 javafx

(重复并已解决 - 请参阅下面的答案)

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

类似 findViewById(R.id.btnPushMe); <- 安卓代码

其实我得到了一个解决方案,但使用起来很不舒服。这看起来像这样:

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());

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>

               ...

提前致谢
马丁

编辑:

这是一个重复的问题(但我不会删除它,因为我花了一些时间来找到答案——也许是因为 JavaFX 没有像 Android 问题那样被问到......)
AnchorPane anchor = (AnchorPane) scene.lookup("#mAnchor");

在这里找到:How to find an element with an ID in JavaFX?

最佳答案

您应该使用 controller class并访问那里的 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>

               ...

然后您可以访问fx:id - Controller 中的属性元素
package app.progui ;

// ...

public class MainController {

    @FXML
    private BorderPane border ;


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

    // ...
}

Controller 类中的字段名称必须匹配 fx:id FXML 文件中的值。

可以访问 fx:id - 调用 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");

假设 fx:id在上面截取的 FXML 中定义。

关于javafx - 如何在 JavaFX 中从 SceneBuilder 访问 UI 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29463176/

相关文章:

java - <Java> 客户端/服务器聊天应用程序在编译时没有响应

java - 根据 fxml、java fx 中子 UI 的点击更新父级 UI

javafx - 为TreeView设置两个根节点

java - 如何让我的程序等到 JavaFX 窗口关闭后再继续?

java - 如何使用主线程而不是 JavaFX 线程中的图表数据?

java - Observablelist 和 arraylist,不同的行为

java - 从表格单元格内的文本字段捕获值

JavaFX - 打开新阶段时取消选择 TextField 中的文本

java - 即使 SQLite 数据库中存在数据也无法登录

java - 如何在 JavaFX 项目中使用 KeyEvent?