实现它是可能的。如果您使用escape或ALT+F4关闭FileChooser,那么事件将被传播,这是正确的,但是您需要考虑哪个事件将被传播?如果你看看
这个
KeyEvent.KEY_RELEASED
威尔。因此,如果你只是在按键时添加一个事件过滤器记录,你就可以知道你在主stage或FileChooser中按下escape(或alt+f4)的时间
所以你或多或少是想知道
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();
}
}