FXML如何工作
FXML通过使用反射(或使用专门的构建器类)对Java API进行内省来工作.有关FXML工作的更多信息,请参阅FXML文档简介.
为什么无法使用FXML标记在JavaFX中的Panes上定义ContextMenus
Control具有contextMenu属性.甲的ScrollPane是一个控制.其他窗格类型(如StackPane)不是控件.由于这些其他窗格类型中没有相应的属性可以设置为包含对contextMenu的引用,因此无法使用FXML在这些窗格类型上定义contextMenu.
出于类似的原因,您无法在窗格上定义工具提示.
如何在FXML控制器中为窗格定义ContextMenu
您仍然可以使用contextMenu show API 通过代码在窗格(以及任何其他不是控件的任意节点)上设置上下文菜单,例如将以下代码放在FXML控制器中.
@FXML StackPane stack;
// . . .
public void initialize() {
final ContextMenu contextMenu = new ContextMenu(new MenuItem("xyzzy"));
stack.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
contextMenu.show(
stack,
mouseEvent.getScreenX(),
mouseEvent.getScreenY()
);
}
});
}
Run Code Online (Sandbox Code Playgroud)
为什么不添加ContextMenu属性
Node可以有一个contextMenu属性,它允许通过FXML标记在Panes上定义ContextMenus.
Node之所以没有contextMenu属性但是Control的原因是因为ContextMenu本身就是一个Control.向节点添加ContextMenu属性意味着JavaFX实现的核心场景图模型代码将依赖于控件模块(这将依赖于场景图模块),因此是循环依赖.这将阻止包含核心JavaFX场景图和渲染引擎的非常轻的Java运行时系统的运送,但不包括控件(不是今天任何人都有这样的系统).
如何归档功能请求
如果您认为应该更改系统以允许使用SceneBuilder在任意窗格上定义上下文菜单,那么您可以针对JavaFX问题跟踪器提交功能请求(如果您这样做,请在功能请求中包含回到此问题的链接) .
| 归档时间: |
|
| 查看次数: |
1288 次 |
| 最近记录: |