【问题标题】:JavaFX ContextMenu doesn't auto-hideJavaFX ContextMenu 不会自动隐藏
【发布时间】:2015-01-05 02:56:39
【问题描述】:

我有一个 JavaFX ContextMenu 分配给鼠标右键单击滚动窗格。它会打开,但当您在滚动窗格外单击时它不会关闭。我可以向滚动窗格添加另一个鼠标事件以隐藏它,但这仅解决了一个问题。主要问题是,当我单击滚动窗格的任何组件时,上下文菜单仍保持打开状态。

示例:通过单击鼠标右键打开弹出窗口,然后单击按钮。弹出菜单仍然打开。

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        final ContextMenu contextMenu = new ContextMenu();

        MenuItem item1 = new MenuItem("About");
        MenuItem item2 = new MenuItem("Preferences");

        contextMenu.getItems().addAll(item1, item2);


        Rectangle rect = new Rectangle( 100,100,150,150);
        Button button = new Button( "Button Text");

        // create nodes
        Group root = new Group();
        root.getChildren().add( rect);
        root.getChildren().add( button);

        // create scrollpane
        ScrollPane sp = new ScrollPane( root);
        sp.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {

                if (event.isSecondaryButtonDown()) {
                    contextMenu.show( sp, event.getScreenX(), event.getScreenY());
                } 
            }
        });



        // create scene
        Scene scene = new Scene(sp, 400, 400, Color.WHITE);

        // add scene to primary stage
        primaryStage.setScene( scene);
        primaryStage.show();
    }
}

文档说有一个 setAutoHide 方法,但在我的情况下它不起作用:

指定弹出窗口是否应该自动隐藏。如果弹出窗口失去焦点并且 autoHide 为 true,则弹出窗口将自动隐藏。这 唯一的例外是使用指定所有者节点时 显示(javafx.scene.Node,双,双)。聚焦所有者节点不会 隐藏弹出窗口。

@defaultValue 假

非常感谢!

【问题讨论】:

    标签: javafx contextmenu javafx-8


    【解决方案1】:

    与父级的子元素交互,将获得该父级的焦点。因此,当您点击代码中的按钮时,上下文菜单不会隐藏。

    试试这两种方法:
    1)手动管理上下文菜单的可见性,即在按钮单击时隐藏它:

    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent arg0) {
            contextMenu.hide();
        }
    });
    

    2) 使用 setContextMenu() 而不是在鼠标按下事件时显示上下文菜单:

    sp.setContextMenu(contextMenu);
    

    【讨论】:

    • setContextMenu() 函数至少会在您单击弹出窗口外部的任何位置时再次关闭它。虽然我希望按下按钮并关闭上下文弹出菜单,但当菜单打开并单击按钮时,它比我以前的要好得多,即。 e.始终打开的上下文菜单。我之前有按钮操作的机制,但由于我在滚动窗格上有数百个对象,所以这不是一个选择。 setContextMenu 是。非常感谢!
    • @Uiuk Biy:你好,你能帮我解决我的问题吗? stackoverflow.com/q/27182323/2722799
    【解决方案2】:

    我知道这是旧帖子,但对于任何新人,我都找到了新的解决方案。我有一个 jdk 1.8,我和你有同样的问题,但是我在 TableView 中有一个动态生成的上下文菜单。因此,当您右键单击该行时,我需要该行内容的另一个上下文菜单。我的解决方案的关键是您在将窗口参数传递给方法的上下文菜单中执行 show 方法。我的代码示例如下:

    ContextMenu contextMenu = this.createContextMenu();
    contextMenu.show(this.tableView.getScene().getWindow(), mouseEvent.getScreenX(), mouseEvent.getScreenY());
    

    当我点击程序的另一个位置时,上下文菜单会隐藏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多