Как мне остановить TextArea от прослушивания сочетаний клавиш как KeyEvents?

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

1 ответ

Если вы хотите остановить работу определенных ускорителей, когда 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 ускорители и потребляют 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,

Другие вопросы по тегам