【问题标题】:JavaFX FXML menuItem actionJavaFX FXML 菜单项操作
【发布时间】: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 中的哪个字段中。

【问题讨论】:

    标签: javafx menuitem fxml


    【解决方案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会在调用的时候设置并调用,而不是在调用之前设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多