Java 显示自定义对话框后应用程序不响应触摸事件

Java 显示自定义对话框后应用程序不响应触摸事件,java,javafx,touch,javafx-8,Java,Javafx,Touch,Javafx 8,就像标题暗示的那样,我的申请有问题。应用程序应该在全屏模式下运行(无意切换回窗口模式),因此我设计了一个页脚栏,其中包含一些图像(在VBox中带有标签),以便用户可以导航或退出程序 因此,启动应用程序后,所有按钮都可以通过触摸正常工作。甚至我的页脚栏中的“退出”按钮也通过打开自定义对话框正确响应。但我的问题开始了。该对话框通过showAndWait()方法调用显示,但不响应触摸事件。相反,仍然会处理鼠标事件(我仍然可以使用鼠标单击对话框中的按钮,并且对话框响应正确) 我希望有人知道我做错了什么

就像标题暗示的那样,我的申请有问题。应用程序应该在全屏模式下运行(无意切换回窗口模式),因此我设计了一个页脚栏,其中包含一些图像(在VBox中带有标签),以便用户可以导航或退出程序

因此,启动应用程序后,所有按钮都可以通过触摸正常工作。甚至我的页脚栏中的“退出”按钮也通过打开自定义对话框正确响应。但我的问题开始了。该对话框通过showAndWait()方法调用显示,但不响应触摸事件。相反,仍然会处理鼠标事件(我仍然可以使用鼠标单击对话框中的按钮,并且对话框响应正确)

我希望有人知道我做错了什么

MyDialog.java:

public static boolean showExitDialog(Window owner, ResourceBundle resources) {
LOGGER.info("Showing exit dialog...");
final Dialog<ButtonType> dialog = new Dialog<ButtonType>();
dialog.getDialogPane().getStylesheets().add(MyDialog.getInstace().getCssPath());
dialog.setContentText(resources.getString("label.exitdialog.text"));
dialog.setHeaderText(resources.getString("label.exitdialog.header"));
dialog.initOwner(owner);
dialog.initStyle(StageStyle.TRANSPARENT);
dialog.initModality(Modality.APPLICATION_MODAL);
dialog.getDialogPane().getButtonTypes().add(new ButtonType(resources.getString("btn.Exitdialog.exit"), ButtonData.OK_DONE););
dialog.getDialogPane().getButtonTypes().add(new ButtonType(resources.getString("btn.Exitdialog.cancel"), ButtonData.FINISH));


Optional<ButtonType> result = dialog.showAndWait();
LOGGER.debug("Result: {}", result.get());
if(result.isPresent() && result.get().getButtonData() == ButtonData.OK_DONE) {
    LOGGER.info("Closing exit dialog returning true...");
    return true;
} else {
    LOGGER.info("Closing exit dialog returning false...");
    return false;
}
}

*编辑*哦,完全忘记:没有抛出异常或任何其他内容。

我不知道所述行为的原因-可能是一个bug。但是,您可以尝试侦听
ActionEvent
,而不是
TouchEvent
。它处理触摸和鼠标事件:

@FXML
private void exitProgramPressedTouch(ActionEvent event) {
  event.consume();
  controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
}
也许您还需要更改FXML文件中绑定事件侦听器的属性(从
onTouch
onAction

最后,我认为,您可以避免
System.exit(0)如果仅在单击“取消”按钮时使用关闭事件:

if(!MyDialog.showExitDialog(primaryStage)) {
  event.consume();
}

我不知道所描述的行为的原因-可能是一个bug。但是,您可以尝试侦听
ActionEvent
,而不是
TouchEvent
。它处理触摸和鼠标事件:

@FXML
private void exitProgramPressedTouch(ActionEvent event) {
  event.consume();
  controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
}
也许您还需要更改FXML文件中绑定事件侦听器的属性(从
onTouch
onAction

最后,我认为,您可以避免
System.exit(0)如果仅在单击“取消”按钮时使用关闭事件:

if(!MyDialog.showExitDialog(primaryStage)) {
  event.consume();
}

从单独的事件处理改为“onAction”成功了!非常感谢。从单独的事件处理改为“onAction”成功了!非常感谢。