【问题标题】:Why is a MenuItem not responding?为什么 MenuItem 没有响应?
【发布时间】:2014-04-23 12:01:48
【问题描述】:

有一个 ContextMenu 有两个选项,当用鼠标右键按下第二个选项(代码中的 item2)时,我希望它打印出一些文本,所以我知道我确实激活了它。到目前为止,当我单击第二个鼠标按钮时没有任何反应。

我还没有太多使用事件处理程序的经验,所以如果我犯了一个愚蠢的错误,我深表歉意。

private void maakContextMenu() {
    menu = new ContextMenu();
    MenuItem item = new MenuItem("Kleur Assen");
    MenuItem item2 = new MenuItem("tweede optie");
    final LissajousCanvas canvas = this;
    item.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            new KiesKleur(canvas).show();
        }
    });
    item2.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){

        @Override
        public void handle(MouseEvent t) {
            System.out.println("in the loop");
            if(t.getSource()==MouseButton.SECONDARY){
                System.out.println("in too deep");
            }
            new KiesKleur(canvas).show();
        }

    });
    menu.getItems().addAll(item, item2);
}

【问题讨论】:

  • 这似乎是一个错误。在 JavaFX 问题跟踪器中搜索类似问题,您可能会从那里获得解决方法。不相关但代码中的另一个问题是 t.getSource()。应该是 t.getButton()。

标签: event-handling javafx


【解决方案1】:

MenuItem 实际上不是Node,因此它不像Nodes 那样属于场景图的一部分。所以我不确定这是否是一个错误;我认为它可能只实现了EventTarget,因此它可以专门生成ActionEvents。您会注意到没有可用的setOnMouseClicked(...) 方法。

这里有一个解决方法。我不确定为什么它只适用于MOUSE_PRESSED 而不适用于MOUSE_CLICKED,但它可能与生成动作事件的默认鼠标事件处理有关:

private void maakContextMenu() {
    menu = new ContextMenu();
    MenuItem item = new MenuItem("", new Label("Kleur Assen"));
    Label menuItem2Label = new Label("tweede optie");
    MenuItem item2 = new MenuItem("", menuItem2Label);
    final LissajousCanvas canvas = this;
    item.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            new KiesKleur(canvas).show();
        }
    });
    menuItem2Label.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>(){

        @Override
        public void handle(MouseEvent t) {
            System.out.println("in the loop");
            if(t.getButton()==MouseButton.SECONDARY){
                System.out.println("in too deep");
            }
            new KiesKleur(canvas).show();
        }

    });
    menu.getItems().addAll(item, item2);
}

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多