我有一个带有几个菜单的GUI。
当前菜单是StackPane的子项,而StackPane又是RootLayout(GridPane)的子项,并且一次只有一个菜单处于活动状态,这意味着StackPane一次只有一个子项。
菜单通过将StackPane中的所有子项替换为新页面来切换。
(theStackpane.getChildren().setAll(newMenu);
)
活动菜单可能有一个更改菜单的按钮,因此单击该按钮可替换StackPane中的所有子项(也是您刚刚单击的按钮)。
问题是,当有一个更改菜单的按钮并且新菜单中的同一位置有一个按钮时,虽然您只是单击了第一个按钮(更改了菜单),但两个按钮都被点击了。 / p>
结构是这样的:
RootLayout .theStackPane ..activeMenu ... oneButton
单击oneButton(更改菜单)会导致:
RootLayout .theStackPane ..newMenu ... twoButton
StackPane保持不变,只是所有的孩子都会被新的交换。
现在如果oneButton位于twoButton的同一位置,oneButton被激活,通过替换所有子节点来更改菜单,显示newMenu,激活twoButton并执行任何操作 - 停止。
虽然我想这样:
如果oneButton位于twoButton的同一位置,oneButton会被激活,通过替换所有子项来更改菜单,显示newMenu - 停止。
如何阻止当前行为?
答案 0 :(得分:0)
buttonOne& buttonOnNewPage在同一个stackPane里面,对吧?然后发生这种情况是因为在事件捕获阶段,stackPane将事件传播到两个按钮,因此当处理程序尝试使用它时,它已经被传播。
因此,不要在buttonOne中使用处理程序,而是尝试使用过滤器,并在其中使用该事件。尝试这样的事情:
EventHandler filter = new EventHandler(<TouchEvent>() {
public void handle(TouchEvent event) {
theStackPane.getChildren().setAll(newPage);
event.consume();
}
}
buttonOne.addEventFilter(TouchEvent.TOUCH_PRESSED, filter);
答案 1 :(得分:0)
我终于找到了解决方案:
当我将setOnTouchPressed
切换为setOnAction
时,我按预期工作了。
当我触摸ActionEvent
时,我不需要使用oneButton
。
所以而不是
oneButton.setOnTouchPressed(e -> {
theStackPane.setAll(newPage);
});
我现在正在使用
oneButton.setOnAction(e -> {
theStackPane.setAll(newPage);
});