【问题标题】:JavaFX FXML - Getting MenuItem using fx:idJavaFX FXML - 使用 fx:id 获取 MenuItem
【发布时间】:2018-06-13 13:08:44
【问题描述】:

我正在使用 Scene Builder 构建 Java 应用程序的 GUI。对于每个元素,我都给了它一个fx:id,以便我以后可以参考它们。我需要在它的许多元素上使用setOnAction(),例如:

((Button)mainPane.lookup("#submitButton")).setOnAction(e->{
    // ... code triggered when button is pressed ...
});

这适用于除MenuItems 之外的大多数元素。当我尝试以下操作时,Eclipse 告诉我“无法从Node 转换为MenuItem”并且它不起作用。

// Does not work
((MenuItem)mainPane.lookup("#about")).setOnAction(e->{
    // ... take user to about page ...
});

我看到MenuItem 只扩展了Object,所以它不能从Node 转换。如何使用fx:id 取回MenuItem

注意:我知道我可以使用 FXML 的 On Action,但我想利用 Lambda 函数并保持事件处理代码的风格相同。

【问题讨论】:

  • 尝试从MenuBar查找它。
  • 在下面使用 Sedrick 的答案。这样,您还可以使用 @FXML MenuItem mnuAbout; 声明声明您的所有 MenuItems。比尝试为每个节点查找fx:id 要好得多。

标签: java javafx fxml scenebuilder


【解决方案1】:

((Button)mainPane.lookup("#submitButton"))

如果您的节点有fx:id。你应该这样做@FXML YourNodeType yourNodeFx:Id;

示例:在 FXML 中您的 Button's fx:id="submitButton"。您的 Controller 代码应如下所示:

@FXML Button submitButton;

在你的初始化方法中你应该这样做:

submitButton.setOnAction(event ->{
    //Your code here!
});

【讨论】:

  • 为了完成 Sedrick 的回答,“提示”只是让变量控制器端的名称与 FXML 端定义的 fx:id 匹配(类型必须匹配!)。 JavaFX 将使它们自动匹配。之后,您可以根据建议添加一些操作事件或您想要的任何内容。
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2014-08-11
相关资源
最近更新 更多