当前位置: 首页 > 知识库问答 >
问题:

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

勾通
2023-03-14

我有一个JavaFX ContextMenu分配给鼠标右键单击一个scrollpane。它会打开,但当您在scrollpane外部单击时,它不会关闭。我可以在scrollpane中添加另一个鼠标事件来隐藏它,但是这只能解决一个问题。主要的问题是,当我单击scrollpane的任何组件时,上下文菜单仍然是打开的。

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

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方法,但在我的情况下不起作用:

指定弹出窗口是否应自动隐藏。如果弹出窗口失去焦点且“自动隐藏”为真,则弹出窗口将自动隐藏。唯一的例外是使用show指定所有者节点(javafx.scene.Node,double,doubel)。聚焦所有者节点不会隐藏PopupWindow。

@defaultValue false

非常感谢!

共有2个答案

宁良平
2023-03-14

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

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

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

孙朝明
2023-03-14

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

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

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

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

sp.setContextMenu(contextMenu);
 类似资料:
  • 我对上下文菜单有问题。在本主题之后,我发现在尝试加载上下文菜单insight JavaFX任务时有一个限制。我测试了实现platform.runlater(),但没有成功。 其他可能的解决方案是:

  • 我想在tableview中添加一个上下文菜单,更具体地说,我想在右键单击时在表行上显示上下文菜单。 我试着用这个代码 上面的代码在JavaFX2.0中工作正常,右键单击时我得到了一个上下文菜单,当我用JavaFX2.1上下文菜单运行我的代码时,它是如何工作的。 我尝试使用showingProperty()方法获取上下文菜单的显示属性,它在JavaFX2.1中返回false,在JavaFX2.0中返

  • 在selenium(Java)中右键单击后,我无法单击任何元素。它只是做了一个右键点击,而不是点击任何选项,如打开新标签。。。相反,它只是在右键点击之后进行普通点击。谁能帮帮我吗。下面是我的代码 系统setProperty(“webdriver.chrome.driver”、“C:\Selenium\chromedriver.exe”);WebDriver wd=新的ChromeDriver();

  • 例如,我想为Acc部门创建“Add Employee”,为IT支持创建“Add Supporter”。 需要根据treeitem的名称显示上下文菜单。

  • 我正在尝试JavaFX,但仍然有很多可能是愚蠢的初学者问题。 我今天的问题如下: 我在Scene builder and Controller中创建了一个流程窗格,我想在其中添加一个右键单击选项,打开一个关联菜单。 通过场景生成器,我添加了OnContextMenuRequest函数并在控制器中定义了它。 为了检查,我在函数中添加了一个打印命令和一个对话框,效果很好。 然而,上下文菜单不起作用。。

  • 因此,我仍然有点了解JavaFX,我能够禁止在文本框中输入文本,但我不知道如何防止右键单击时出现上下文菜单。有人知道如何防止右键单击时弹出默认上下文菜单吗?`