javafx-2 - 如何创建弹出菜单

标签 javafx-2 popupmenu

我是 javafx 的新手。我想在单击鼠标右键时显示​​弹出菜单。我找到一个教程HereHere但不明白。我想创建弹出菜单,该菜单显示在此链接的图像中。

现在我正在创建舞台,但我不想要舞台。我需要显示弹出菜单,该菜单在右键单击时显示,并在单击任意位置时关闭。

这是我正在使用阶段的代码,但我需要像上面的链接一样打开弹出菜单。

 public void MouseClickedOnTree(MouseEvent event) {
if (event.isSecondaryButtonDown()) {

        System.out.println("secondary press");
        final Stage optionstage = new Stage();

        VBox vBox = new VBox(5);
        vBox.setMinHeight(50);
        vBox.setMinWidth(50);
        Button btnNewTestBed = new Button("New Testbed");
        btnNewTestBed.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                try {
                     optionstage.close();
                    stage.show();
                } catch (IOException ex) {
                    Exceptions.printStackTrace(ex);
                }
            }
        });
        Button btnOpenTestbed = new Button("Open Testbed");
        btnOpenTestbed.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                optionstage.close();

            }
        });
        optionstage.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent t) {
                if (t.getCode() == KeyCode.ESCAPE) {
                    System.out.println("click on escape");
                    //Stage sb = (Stage) label.getScene().getWindow();//use any one object
                    if(optionstage.isShowing())
                        optionstage.close();
                }
            }
        });

        vBox.getChildren().addAll(btnNewTestBed, btnOpenTestbed);
        optionstage.setScene(new Scene(vBox, 100, 100));
        //stage.setScene(new Scene(new Group(new Text(50,50, "my second window")))); 
        optionstage.setX(event.getSceneX());
        optionstage.setY(event.getScreenY());
        optionstage.initStyle(StageStyle.UNDECORATED);
        optionstage.show();

    }

请向我提供任何链接或引用。

最佳答案

您的代码的上下文不是很清楚:这是在事件处理程序内吗?如果是这样,它的事件处理程序有什么用?如果不是,那么开头 if 语句中的 event 是什么?

您提供的两个链接非常复杂;在 JavaFX 中(与 Swing 不同),您应该只考虑为相当高级的用例对现有 Node 类进行子类化。您不需要这种复杂程度来创建弹出菜单。

创建弹出菜单的最简单方法是使用Control(或子类);您只需创建一个 ContextMenu,向其中添加 MenuItem,并将其设置为控件上的 contextMenu:

TextField textField = new TextField("Type Something"); // we will add a popup menu to this text field
final ContextMenu contextMenu = new ContextMenu();
MenuItem cut = new MenuItem("Cut");
MenuItem copy = new MenuItem("Copy");
MenuItem paste = new MenuItem("Paste");
contextMenu.getItems().addAll(cut, copy, paste);
cut.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println("Cut...");
    }
});
// ...
textField.setContextMenu(contextMenu);

如果您想在不是 Control 的节点(PaneShape)上使用 ContextMenu code>,例如),您没有 setContextMenu(...) 方法,因此您只需要多做一点工作:

final AnchorPane pane = new AnchorPane();
// fill pane with nodes, etc
// create context menu and menu items as above
pane.setOnMousePressed(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        if (event.isSecondaryButtonDown()) {
            contextMenu.show(pane, event.getScreenX(), event.getScreenY());
        }
    }
});

请参阅Javadocs对于 ContextMenututorial了解更多详情。

关于javafx-2 - 如何创建弹出菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635192/

相关文章:

eclipse - 启用/禁用 Eclipse 插件中的菜单项

user-interface - 使用一行代码在 MATLAB 中返回弹出菜单选择

android - MenuPopupHelper 不能在没有 anchor 的情况下使用

java - 从 JavaFX 应用程序复制图像并使用 Windows 粘贴

java - 将第二个项目添加到我的堆栈 Pane 时,第一个项目失去了它的 Event/MouseOn。为什么?我该如何解决? JavaFX

imageview - 调整图像大小以适合父节点

javafx-2 - JavaFX,如何卡住TableView中某些列的位置

java - 双击 JavaFX 2.2 禁用 TreeItem 的默认展开/折叠

android - Android ListView 中的弹出菜单问题

vb6 - 在 VB6 中使 PopupMenu 出现在 TreeView 的选定项处