应用程序在显示自定义对话框后未响应 Touch-Events
Application not responding to Touch-Events after showing custom dialog
如标题所示,我的应用程序有问题。该应用程序应该 运行 全屏模式(无意切换回 window 模式),所以我设计了一个 footer-bar 来保存一些图像(带有标签,在 VBox 中)所以用户可以导航或退出程序。
因此,在启动应用程序后,所有按钮都可以通过触摸正常工作。甚至我的 footer-bar 中的 Exit-button 也通过打开我的自定义对话框正确响应。但这里开始我的问题。对话框由 showAndWait()-方法调用显示,但不响应 Touch-Events。相反 mouse-events 仍在处理(我仍然可以使用鼠标单击对话框中的按钮并且对话框正确响应)。
我希望有人知道我做错了什么。
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;
}
}
在MainApp.java中:
private EventHandler<WindowEvent> confirmCloseEventHandler = event -> {
// close event handling logic.
// consume the event if you wish to cancel the close operation.
if(MyDialog.showExitDialog(primaryStage, rb)) {
event.consume();
System.exit(0);
}
};
...
primaryStage.setOnCloseRequest(confirmCloseEventHandler);
在FooterBar.java中:
@FXML
private void exitProgramPressedTouch(TouchEvent event) {
event.consume();
controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
}
*编辑*哦,完全忘记了:没有异常或其他任何东西被抛出。
我不知道所描述行为的原因 - 可能是错误。但是,您可以尝试监听 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();
}
如标题所示,我的应用程序有问题。该应用程序应该 运行 全屏模式(无意切换回 window 模式),所以我设计了一个 footer-bar 来保存一些图像(带有标签,在 VBox 中)所以用户可以导航或退出程序。
因此,在启动应用程序后,所有按钮都可以通过触摸正常工作。甚至我的 footer-bar 中的 Exit-button 也通过打开我的自定义对话框正确响应。但这里开始我的问题。对话框由 showAndWait()-方法调用显示,但不响应 Touch-Events。相反 mouse-events 仍在处理(我仍然可以使用鼠标单击对话框中的按钮并且对话框正确响应)。
我希望有人知道我做错了什么。
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;
}
}
在MainApp.java中:
private EventHandler<WindowEvent> confirmCloseEventHandler = event -> {
// close event handling logic.
// consume the event if you wish to cancel the close operation.
if(MyDialog.showExitDialog(primaryStage, rb)) {
event.consume();
System.exit(0);
}
};
...
primaryStage.setOnCloseRequest(confirmCloseEventHandler);
在FooterBar.java中:
@FXML
private void exitProgramPressedTouch(TouchEvent event) {
event.consume();
controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
}
*编辑*哦,完全忘记了:没有异常或其他任何东西被抛出。
我不知道所描述行为的原因 - 可能是错误。但是,您可以尝试监听 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();
}