【问题标题】:How to get the name of a MenuItem which is clicked in a MenuButton如何获取在 MenuButton 中单击的 MenuItem 的名称
【发布时间】:2016-06-03 08:00:37
【问题描述】:

我正在尝试获取 MenuItem 的名称,然后将 Label 文本设置为 MenuButton 中此单击的 MenuItem 的名称。我怎样才能做到这一点? MenuItems 从数据库中的字符串获取 id。

变量:

@FXML
private MenuButton projektAuswahl;

MenuItem item;

创建新的菜单项:

ResultSet rs = stmt.executeQuery(sqlQuery);

while (rs.next()) {
    item = new MenuItem(rs.getString(1));
    item.setId(rs.getString(1));
    projektAuswahl.getItems().add(item);
}

设置标签文本:

private void setProjectLabel() {
        //projectnameLabel.setText(item.getText()); //not working..
    }

如何识别点击了哪个 MenuItem?

【问题讨论】:

    标签: java javafx onclick menuitem


    【解决方案1】:

    您还需要为onAction event 注册一个处理程序。这可以是每个MenuItem 的一个新的,保存有关每个文本的数据,或者您可以访问event source 以获取对MenuItem 的引用:

    static MenuItem createMenuItem(String text, EventHandler<ActionEvent> handler) {
        MenuItem result = new MenuItem(text);
        result.setOnAction(handler);
        return result;
    }
    
    private Label projectnameLabel;
    
    private void setProjectLabel(ActionEvent event) {
        MenuItem source = (MenuItem) event.getSource();
        projectnameLabel.setText(source.getText());
    }
    
    @Override
    public void start(Stage primaryStage) {
        EventHandler<ActionEvent> handler = this::setProjectLabel;
    
        MenuButton btn = new MenuButton("menu");
        btn.getItems().addAll(createMenuItem("a", handler),
                createMenuItem("b", handler),
                createMenuItem("c", handler));
    
        projectnameLabel = new Label();
    
        VBox root = new VBox(10, btn, projectnameLabel);
    
        Scene scene = new Scene(root);
    
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    

    【讨论】:

      【解决方案2】:

      您可以直接在代码中添加动作监听器:

          menuItem.setOnAction(new EventHandler<ActionEvent>() {
              @Override
              public void handle(ActionEvent t) {
                  setProjectLabel(); // in your case
              }
          });
      

      或者我建议您在 fxml 中添加一个控制器,然后替换您在其中显示的所有代码并将 setProjectLabel() 与 SceneBuilder 中的菜单项绑定:

      【讨论】:

      • 如果数据库中没有数据,则菜单项不存在。这是不可能的。
      • 是的,您可以像 fabian 所说的那样创建 Menuitem 并添加 Action Handler。顺便说一句,如果你不使用scenebuilder,为什么要添加@FXML?
      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2012-02-23
      • 2012-12-27
      • 2012-11-29
      相关资源
      最近更新 更多