【发布时间】: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