【发布时间】:2013-10-28 00:02:14
【问题描述】:
我有一个包含可聚焦节点的ScrollPane。
当前的默认行为是:
Shift + ←, ↑, →, ↓移动焦点
-
←,↑,→,↓滚动视图
李>
我想要反过来。 我怎样才能做到这一点或者我应该从哪里开始?
[EDIT]好吧,还有另一种脆弱的方法。
与其乱搞事件,不如乱搞KeyBindings。
scrollPane.skinProperty().addListener(new ChangeListener<Skin<?>>() {
@Override
public void changed(ObservableValue<? extends Skin<?>> observable, Skin<?> oldValue, Skin<?> newValue) {
ScrollPaneSkin scrollPaneSkin = (ScrollPaneSkin) scrollPane.getSkin();
ScrollPaneBehavior scrollPaneBehavior = scrollPaneSkin.getBehavior();
try {
Field keyBindingsField = BehaviorBase.class.getDeclaredField("keyBindings");
keyBindingsField.setAccessible(true);
List<KeyBinding> keyBindings = (List<KeyBinding>) keyBindingsField.get(scrollPaneBehavior);
List<KeyBinding> newKeyBindings = new ArrayList<>();
for (KeyBinding keyBinding : keyBindings) {
KeyCode code = keyBinding.getCode();
newKeyBindings.add(code == KeyCode.LEFT || code == KeyCode.RIGHT || code == KeyCode.UP || code == KeyCode.DOWN ? keyBinding.shift() : keyBinding);
}
keyBindingsField.set(scrollPaneBehavior, newKeyBindings);
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
LOGGER.warn("private api changed.", e);
}
}
});
我认为,如果 KeyBindings 更加非静态、可修改和公开,那可能是更简洁的方式。
【问题讨论】:
标签: focus javafx scrollview key-bindings javafx-8