Java 我们如何在FXML中定义上下文菜单?
虽然我可以在没有FXML的情况下定义上下文菜单,但我没有找到在FXML中定义上下文菜单的好方法: 在源文件中:Java 我们如何在FXML中定义上下文菜单?,java,javafx,fxml,Java,Javafx,Fxml,虽然我可以在没有FXML的情况下定义上下文菜单,但我没有找到在FXML中定义上下文菜单的好方法: 在源文件中: ContextMenu contextMenu = new ContextMenu(); contextMenu.getItems().addAll(someMenuItems); // This runs perfectly 在FXML中: <ContextMenu fx:id="contextMenu"> </ContextMenu> // This is
ContextMenu contextMenu = new ContextMenu();
contextMenu.getItems().addAll(someMenuItems);
// This runs perfectly
在FXML中:
<ContextMenu fx:id="contextMenu">
</ContextMenu>
// This is incorrect in fxml. The Exception of "Unable to coerce javafx.scene.control.ContextMenu to class javafx.scene.Node" is thrown.
<MenuBar fx:id="menuBar">
//... Some Menu and items could be defined here
</MenuBar>
// This is correct in fxml
//这在fxml中是不正确的。抛出异常“无法将javafx.scene.control.ContextMenu强制为类javafx.scene.Node”。
//... 这里可以定义一些菜单和项目
//这在fxml中是正确的
我理解MenuBar之所以有效,是因为它扩展了javafx.scene.control.control,后者是javafx.scene.Node的一个子类,但ContextMenu没有
那么,有没有办法在FXML中类似地定义ContextMenu的属性呢?尝试通过
ContextMenu
属性在相应的节点上下文中定义它(没有双关语:):
<TextField fx:id="tf">
<contextMenu>
<ContextMenu fx:id="cmTF">
<items>
<MenuItem text="Add"/>
<MenuItem text="Remove"/>
<MenuItem text="Enhance"/>
</items>
</ContextMenu>
</contextMenu>
</TextField>
试试这个
<BorderPane fx:id="borderPane" fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml">
<fx:define>
<ContextMenu fx:id="contextMenu">
<items>
<MenuItem text="Menu Item"/>
</items>
</ContextMenu>
</fx:define>
</BorderPane>
我知道有些人喜欢手动编写FXML而不是使用Scene Builder,但如果不知道如何手动执行某些操作,则只需使用Scene Builder来完成该部分,然后查看FXML是如何生成的。谢谢!我没有注意到contextMenu实际上是节点内部的一个属性!
public class Controller {
@FXML
private ContextMenu contextMenu;
@FXML
private BorderPane borderPane;
@FXML
private void initialize() {
borderPane.setOnContextMenuRequested(event -> {
contextMenu.show(borderPane, event.getScreenX(), event.getScreenY());
});
}
}