Несоблюдение RTL при навигации по таблицам - это ошибка , исправленная в openjfx15 .
. До этого мы можем взломать (если нам разрешено использовать go dirty, то есть использовать Отражение для доступа к закрытому полю в TableViewSkin, использования внутреннего API и деталей реализации;)
- получить обложку таблицы (обычно доступно после отображения таблицы) и доступ к поведению ее внутреннего поля
- получить левый / правый keyMappings из карты ввода поведения и удалить их
- использовать соответствующие им обработчики событий для перекрестного соединения между ключом и обработчиком и добавить их
In код, что-то вроде (здесь только для левого / правого, нужно сделать то же самое для отображений с модификаторами):
protected void hackNavigation(TableView<?> table) {
TableViewSkin<?> skin = (TableViewSkin<?>) table.getSkin();
// access private field reflectively
// use your own favorite utility method :)
TableViewBehavior<?> behavior = (TableViewBehavior<?>)
FXUtils.invokeGetFieldValue(TableViewSkin.class, skin, "behavior");
// access mappings
ObservableList<Mapping<?>> mappings = behavior.getInputMap().getMappings();
// lookup the original mappings for left/right
KeyBinding leftBinding = new KeyBinding(KeyCode.LEFT);
KeyBinding rightBinding = new KeyBinding(KeyCode.RIGHT);
KeyMapping leftMapping = getMapping(mappings, leftBinding);
KeyMapping rightMapping = getMapping(mappings, rightBinding);
// remove the original mappings
mappings.removeAll(leftMapping, rightMapping);
// create new mappings with the opposite event handlers and add them
KeyMapping replaceRight = new KeyMapping(rightBinding, leftMapping.getEventHandler());
KeyMapping replaceLeft = new KeyMapping(leftBinding, rightMapping.getEventHandler());
mappings.addAll(replaceRight, replaceLeft);
}
/**
* Utility method to get hold of a KeyMapping for a binding.
* Note: only use if certain that it is contained, or guard against failure
*/
protected KeyMapping getMapping(ObservableList<Mapping<?>> mappings, KeyBinding keyBinding) {
Optional<KeyMapping> opt = mappings.stream()
.filter(mapping -> mapping instanceof KeyMapping)
.map(mapping -> (KeyMapping) mapping)
.filter(keyMapping -> keyMapping.getMappingKey().equals(keyBinding))
.findAny()
;
return opt.get();
}
// useage
stage.show();
hackNavigation(myTable);