Search code examples
javajavafxtouchjavafx-8

Application not responding to Touch-Events after showing custom dialog


like the title implies i've got a problem with my application. The application is supposed to run in fullscreen mode (no intention for switching back to window mode), so i designed a footer-bar holding some images (with a Label, in a VBox) so the user could navigate or exit the program.

So after starting the application all Buttons work just fine with touch. Even the Exit-button in my footer-bar responded correctly by opening my custom Dialog. But here starts my Problem. The Dialog is shown by showAndWait()-Method call, but does not respond to Touch-Events. In contrary mouse-events are still processed (i still can use a mouse to click the Buttons in my Dialog and the Dialog is responding correctly).

I hope someone got an idea what i'm doing wrong.

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;
}
}

In 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);

In FooterBar.java:

@FXML
private void exitProgramPressedTouch(TouchEvent event) {
event.consume();
controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
}

*Edit* Oh totally forgot: No Exception or anything else is thrown.


Solution

  • I don't know the reason for the described behavior - maybe a bug. However, you could try to listen for ActionEvent instead of TouchEvent. It handles both touch and mouse events:

    @FXML
    private void exitProgramPressedTouch(ActionEvent event) {
      event.consume();
      controller.getWindow().fireEvent(new WindowEvent(controller.getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST));
    }
    

    Maybe you need also to change the attribute which binds the event listener (from onTouch to onAction) in your FXML file.

    Finally, I think, you could avoid System.exit(0); if you consume the close event only when the cancel button has been clicked:

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