JavaFX FXML 菜单项操作

Posted

技术标签:

【中文标题】JavaFX FXML 菜单项操作【英文标题】:JavaFX FXML menuItem action 【发布时间】:2014-10-18 09:42:40 【问题描述】:

当我在 MenuButton 对象中选择一个 MenuItem 时,我试图设置一个变量值。 我试图搜索这个,但我空手而归。

这里是设置 MenuItems 的代码:

private ObservableList<MenuItem> templateMenuItems = FXCollections.observableArrayList();
@FXML private MenuButton menu = new MenuButton();

@FXML
protected void getTemplates() throws IOException 
    CaspReturn tls = this.socket.runCmd(new Tls(""));
    String tlsList = tls.getResponse();
    String[] tlsListSplitt = tlsList.split("\\n");
    for (int i = 0; i < tlsListSplitt.length; i++) 
        String[] tlsLine = tlsListSplitt[i].split("\"");
        this.templateMenuItems.add(new MenuItem(tlsLine[1]));
    
    this.menu.getItems().setAll(this.templateMenuItems);

我不确定如何编写代码以从 menuItem 中获取文本,或者该方法应该位于 scenebuilder 中的哪个字段中。

【问题讨论】:

【参考方案1】:

不清楚您的要求是什么,但我假设您想知道单击菜单项时的文本。为此,您需要在菜单项上添加一个事件处理程序。以下内容摘自 ContextMenu 的 JavaDoc:

MenuItem item1 = new MenuItem("About");
item1.setOnAction(new EventHandler<ActionEvent>() 
    public void handle(ActionEvent e) 
        System.out.println("About");
    
);

您可以获取事件源,将其转换为 MenuItem,然后从中获取文本。

不过,您的代码编写方式确实存在问题。您在 getTemplates 中调用了一个外部数据库,因为它被实现为一个 @FXML 元素,几乎可以保证它将在 FXAT 上运行,这非常非常糟糕。

我将对其进行重构,以便数据库访问位于任务中,然后 MenuItem 创建是任务的 onSucceeded 事件的处理程序。然后您需要实例化一个 ContextMenu 并在该事件处理程序中安装 MenuItem。

getTemplates() 方法应作为按钮的 onAction 事件调用。

【讨论】:

谢谢,我以为action会在调用的时候设置并调用,而不是在调用之前设置。

以上是关于JavaFX FXML 菜单项操作的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX:如何从 MenuItem 更改场景 (FXML)

将项添加到comboBox javaFx FXML时出错[重复]

我可以使用 JavaFX 向我的程序添加更多开始菜单项吗?

在 JavaFX 中制作垂直菜单栏

JavaFX 2.0 像 MenuItem 一样激活菜单

javafx中菜单上的单击事件