Остановить распространение события ключа средства выбора файлов на (родительский) этап в JavaFX - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно слушать ключевые события на сцене, но не тогда, когда отображается FileChooser.

Есть ли способ остановить KeyEvent (например, нажата кнопка Esc) для распространения (родительского) Stage, когда отображается FileChooser?

OR

Обнаружить, что KeyEvent распространяется от FileChooser?

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 Ответ

0 голосов
/ 05 ноября 2018

Этого можно добиться. Вы правы, что если вы закроете 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...