【问题标题】:Accessing scene from controller class从控制器类访问场景
【发布时间】:2014-01-10 00:05:51
【问题描述】:

我是新手,正在尝试学习 JavaFX 和 FXML。我的大部分应用程序逻辑都在 FXMLController 类中,而基类几乎是空的,除了 NetBeans IDE 生成的基本代码,如下所示

@Override
public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
}

我有一个 ID 为 input1 的元素,其类型为 TextField。我怎样才能访问这个(或任何 其他)通过其 ID 控制? (请记住,我在控制器类而不是主类中)。

我在下面找到了这个问题,这正是我正在寻找的,但情况不同,因为它们位于定义 scene 的主类中。如何从控制器类访问scene 并使用以下问题中的代码。

How to find an element with an ID in JavaFX?

【问题讨论】:

    标签: javafx-2 fxml


    【解决方案1】:

    这是我第一次在 Stack Overflow 上回答问题,所以请放轻松。

    我也是 JavaFX 的新手,我也遇到了这个问题。 这就是如果找到的话。 FXMLDocument.fxml 中的 TextField 必须有一个 fx:id 分配给它,如:

    <TextField fx:id="input1" layoutX="0.5" layoutX="0.5" />
    

    如果您使用的是 JavaFX SceneBuilder,那么您可以在右侧的“代码:TextField”下找到 fx:id。

    然后在您的控制器类中,您可以访问它,但使用。

    @FXML public TextField input1;
    

    您可以使用 ArrayList 循环遍历所有的 TextField。 这是一个例子。

    @FXML public TextField input1;
    @FXML public TextField input2;
    @FXML public TextField input3;
    @FXML public TextField input4;
    @FXML public TextField input5;
    @FXML public TextField input6;
    @FXML public TextField input7;
    @FXML public Button button;
    
    List<TextField> inputs = new ArrayList<TextField>();
    
    public void displayText(ActionEvent event) {
        inputs.add(input1);
        inputs.add(input2);
        inputs.add(input3);
        inputs.add(input4);
        inputs.add(input5);
        inputs.add(input6);
        inputs.add(input7);
        for (int x = 0; x < 7; x++) {
            System.out.println(inputs.get(x).getText());
        }
    }
    

    可能有更简单的方法,但这种方法对我有用。

    【讨论】:

    • 您可以对场景图中作为您要查找的节点的祖先的任何内容调用lookup(...) 或lookupAll(...)。因此,只需使用注入(fx:id 和 @FXML 注释)来获取对包含所有文本字段(例如根元素)的内容的引用,然后调用 lookup(...) 。查找有点脆弱;仅在渲染场景后才能保证它们起作用(因此在 initialize(...) 方法中不起作用。最好将文本字段放在列表或数组中并遍历它。
    • ArrayList 可能是您最好的选择。我将更新我的答案以显示一个示例。
    • 感谢您的帮助。我现在将使用 List,对于我正在从事的一个简单项目来说似乎已经足够了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2019-10-19
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多