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