Как мне остановить 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
,