6
我收到了一個包含可調焦節點的ScrollPane
。JavaFX:使用箭頭鍵滾動與焦點遍歷
當前的默認行爲是:
移 + ←,↑,→,↓移動聚焦
←,↑,→,↓滾動視圖
我希望它周圍的其他方法。 我該如何做到這一點,或者我應該從哪裏開始?
[編輯]嗯,還有另一種脆弱的方法。
而不是亂搞事件,人們可能會混淆KeyBinding
s。
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);
}
}
});
我想,這可能是更清潔的方式,如果一個KeyBinding更非靜態,modifyable和公衆。
這正是我一直在尋找。首先嚐試將代碼接管到我的應用程序中,但導致出現StackOverflowError錯誤。我會在晚上看這個。謝謝! –
copyFor語句是關鍵,否則代碼JavaFX系統將在內部複製事件以設置源和目標,因此您將最終處於事件重新映射的無限循環中,打開和關閉切換修改器,導致溢出。我的測試系統是帶有Java 8的OS X. – jewelsea
不知何故,在我的應用程序中,沒有事件從'mappedEvents'列表中移除。你的例子工作正常。我無法弄清楚到目前爲止發生了什麼變化。 –