Ich habe eine ScrollPane
mit fokussierbaren Knoten.JavaFX: Scrollen vs Fokus Traversal mit den Pfeiltasten
Das aktuelle Standardverhalten ist:
Shift- + ←, ↑, →, ↓ bewegt sich der Fokus
←, ↑, →, ↓ scrollt die Ansicht
ich es anders wollen um. Wie kann ich dies erreichen oder wo soll ich anfangen?
[EDIT] Nun, ist es eine andere fragile Ansatz.
Statt mit den Ereignissen rumzualbern, könnte man mit der KeyBinding
s herumspielen.
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);
}
}
});
Ich denke, das könnte der Reiniger Art und Weise sein, wenn KeyBindings mehr nicht statisch war, modifizierbar und Öffentlichkeit.
Das ist genau das, was ich suchte. Ein kurzer erster Versuch, den Code in meine Anwendung zu übernehmen, führte jedoch zu einem 'StackOverflowError'. Ich werde mir das am Abend ansehen. Vielen Dank! –
Die copyFor-Anweisung ist ein Schlüssel, andernfalls wird das JavaFX-System das Ereignis intern kopieren, um die Quelle und das Ziel festzulegen, sodass Sie in einer Endlosschleife der Ereigniszuordnung landen und den Verschiebemodifikator ein- und ausschalten, was zu einem Überlauf führt. Mein Testsystem war OS X mit Java 8. – jewelsea
Irgendwie werden in meiner Anwendung keine Ereignisse aus der 'mappedEvents' Liste entfernt. Ihr Beispiel funktioniert gut. Ich konnte nicht herausfinden, was den Unterschied ausmacht. –