如何正确使用JavaFX TouchEvent?

时间:2015-07-19 23:22:57

标签: user-interface layout javafx

我有一个带有几个菜单的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 - 停止。

如何阻止当前行为?

2 个答案:

答案 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);
});