2014-11-08 68 views
3

我有一个JavaFX ContextMenu分配给鼠标右键单击一个滚动窗格。它会打开,但在滚动窗格外单击时它不会关闭。我可以将另一个鼠标事件添加到滚动窗格以隐藏它,但这只能解决1个问题。主要的问题是,当我点击滚动窗格的任何组件时,上下文菜单保持打开状态。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(); 
    } 
} 

enter image description here

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

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

@defaultValue假

非常感谢您!

回答

6

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

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

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

2)使用setContextMenu(),而不是显示在按下鼠标右键菜单事件:

sp.setContextMenu(contextMenu); 
+0

setContextMenu()函数至少在您点击任何地方时再次关闭弹出窗口。虽然我希望有一个按钮按下并且关闭了contextpopup菜单,但是当菜单打开并且我单击按钮时,但它远远胜过我以前的版本。即始终打开的上下文菜单。我之前有过按钮动作的机制,但由于我在滚动窗格上有一些对象,这不是一个选项。 setContextMenu是。非常感谢你! – Roland 2014-11-08 14:43:05

+0

@Uiuk Biy:你好,你能帮我解决我的问题吗? stackoverflow.com/q/27182323/2722799 – 2014-11-28 05:41:56