Этого можно добиться. Вы правы, что если вы закроете FileChooser, используя escape или ALT + F4, событие будет распространено, но вам нужно подумать, какое событие произойдет? если вы смотрите только , то KeyEvent.KEY_RELEASED
будет. Так что, если вы просто добавите запись фильтра событий при нажатии клавиши, вы сможете узнать, когда вы нажимали escape (или alt + f4) на основной сцене или в FileChooser
Итак, более или менее вы пытаетесь выяснить, был ли KEY_PRESSED
обработан FileChooser или нет. Если это так, то KEY_RELEASED
также будет обрабатываться из FileChooser, в противном случае мы запускаем KeyEvent в нашем основном приложении.
Вот пример:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
public class Main extends Application {
private boolean captureKeys = false;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
Button browseBtn = new Button("Browse File System");
browseBtn.setOnAction(ae -> {
captureKeys = false;
FileChooser fileChooser = new FileChooser();
fileChooser.showOpenMultipleDialog(stage);
});
stage.setScene(new Scene(new BorderPane(browseBtn), 500, 200));
stage.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> {
captureKeys = true;
// For debug
// KeyCode keyCode = keyEvent.getCode();
// System.out.println("KEY_PRESSED on Stage : " + keyCode);
});
stage.addEventHandler(KeyEvent.KEY_RELEASED, keyEvent -> {
if(captureKeys) {
KeyCode keyCode = keyEvent.getCode();
System.out.println(keyCode);
}
});
stage.centerOnScreen();
stage.show();
}
}