我是 javafx 的新手。我想在单击鼠标右键时显示弹出菜单。我找到一个教程Here和 Here但不明白。我想创建弹出菜单,该菜单显示在此链接的图像中。
现在我正在创建舞台,但我不想要舞台。我需要显示弹出菜单,该菜单在右键单击时显示,并在单击任意位置时关闭。
这是我正在使用阶段的代码,但我需要像上面的链接一样打开弹出菜单。
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
的节点(Pane
或 Shape
)上使用 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());
}
}
});
关于javafx-2 - 如何创建弹出菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635192/