JavaFX上下文菜单不自动隐藏。

8

我有一个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,则弹出窗口将自动隐藏。唯一的例外是当使用show(javafx.scene.Node, double, double)指定owner Node时。聚焦owner Node不会隐藏PopupWindow。

@defaultValue false

非常感谢!

2个回答

14
与父元素的子元素交互,将获得对该父元素的焦点。因此,在单击代码中的按钮时,上下文菜单不会隐藏。
尝试这两种方法:
1)手动管理上下文菜单的可见性,即在按钮单击时隐藏它:
button.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent arg0) {
        contextMenu.hide();
    }
});

2) 使用 setContextMenu() 代替在鼠标按下事件中显示上下文菜单:

sp.setContextMenu(contextMenu);

setContextMenu()函数至少在你点击它之外的任何地方时关闭弹出窗口。虽然当菜单打开并且我点击按钮时,我期望有一个按钮按下和上下文弹出菜单的关闭,但这比我以前拥有的总是打开的上下文菜单要好得多。我之前已经使用了按钮操作的机制,但由于滚动窗格上有数百个对象,所以这不是一个选项。setContextMenu就是。非常感谢! - Roland
@Uiuk Biy:你好,能帮我解决一下我的问题吗?stackoverflow.com/q/27182323/2722799 - Java Man

9

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

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

当我点击程序中的其他位置时,上下文菜单就会隐藏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接