Как мне остановить TextArea от прослушивания сочетаний клавиш как KeyEvents? - PullRequest
0 голосов
/ 29 сентября 2018

Как и в заголовке, как мне остановить использование комбинаций клавиш (акселераторов) в качестве ключевых событий в TextArea?Я попробовал метод, предложенный здесь, с различными модификациями: TextArea игнорировать KeyEvent в JavaFX без удачи.

1 Ответ

0 голосов
/ 30 сентября 2018

Если вы хотите остановить работу определенных ускорителей, когда фокусировка TextArea, просто добавьте фильтр событий для KEY_PRESSED событий.

public class AcceleratorFilter implements EventHandler<KeyEvent> {

  // blacklist of KeyCombinations
  private final Set<KeyCombination> combinations;

  public AcceleratorFilter(KeyCombination... combinations) {
    this.combinations = Set.of(combinations);
  }

  @Override
  public void handle(Event event) {
    if (combinations.stream().anyMatch(combo -> combo.match(event)) {
      event.consume();
    }
  }

}

TextArea area = new TextArea();
area.addEventFilter(KeyEvent.KEY_PRESSED, new AcceleratorFilter(
  KeyCombination.valueOf("shortcut+o"),
  KeyCombination.valueOf("shortcut+s") // etc...
));

Если вы хотите без разбора блокировать все ускорители, зарегистрированные с помощью Scene, то вы можете запросить ускорители Scene s и использовать KeyEvent, если это необходимо.

TextArea area = new TextArea();
area.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
  var scene = ((Node) event.getSource()).getScene();
  // #getAccelerators() = ObservableMap<KeyCombination, Runnable>
  var combos = scene.getAccelerators().keySet();
  if (combos.stream().anyMatch(combo -> combo.match(event)) {
    event.consume();
  }
});

Эта последняя опция может вызвать проблемы, еслиты не остороженНапример, если у вас есть Button по умолчанию в Scene, то вышеупомянутый фильтр событий может помешать клавише ENTER.Кроме того, этот параметр не обязательно останавливает такие вещи, как shortcut+c, shortcut+v и т. Д., Поскольку эти ярлыки зарегистрированы с TextInputControl, а не с Scene.

.
...