代码之家  ›  专栏  ›  技术社区  ›  Venkata Raju

停止文件选择器键事件传播到JavaFX中的(父)阶段

  •  3
  • Venkata Raju  · 技术社区  · 7 年前

    FileChooser

    有办法阻止吗 KeyEvent Esc 按键。)传播到(父级) Stage 什么时候 文件选择器 是否显示?

    或

    检测到 键盘事件 传播自 ?

    class KeyEventTest extends Application
    {
      @Override
      public void start(Stage stage) throws Exception
      {
        Button browseBtn = new Button("Browse File System");
        browseBtn.setOnAction(ae ->
          {
            FileChooser fileChooser = new FileChooser();
            fileChooser.showOpenMultipleDialog(stage);
          });
    
        stage.setScene(new Scene(new BorderPane(browseBtn), 500, 200));
        stage.setTitle("Test");
    
        stage.addEventHandler(KeyEvent.KEY_RELEASED, keyEvent ->
          {
            // Do not trigger when Esc key is pressed on FileChooser
            KeyCode keyCode = keyEvent.getCode();
            System.out.println(keyCode);
          });
    
        stage.centerOnScreen();
        stage.show();
      }
    
      public static void main(String[] args)
      {
        launch(args);
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   JKostikiadis    7 年前

    实现它是可能的。如果您使用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();
        }
    }
    
    推荐文章