Tôi nhận được ScrollPane
chứa các nút có tiêu điểm.JavaFX: di chuyển so với tiêu điểm với các phím mũi tên
Hành vi mặc định hiện nay là:
phím Shift + ←, ↑, →, ↓ di chuyển trọng tâm
←, ↑, →, ↓ cuộn quan điểm
Tôi muốn nó theo cách khác xung quanh. Tôi làm cách nào để thực hiện việc này hoặc tôi nên bắt đầu từ đâu?
[EDIT] Vâng, đó là một cách tiếp cận mong manh.
Thay vì xáo trộn xung quanh các sự kiện, người ta có thể gây rối xung quanh với KeyBinding
giây.
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);
}
}
});
Tôi nghĩ, đó có thể là cách rõ ràng hơn, nếu KeyBindings không tĩnh, có thể sửa đổi và công khai hơn.
Đó chính xác là những gì tôi đang tìm kiếm. Một nỗ lực đầu tiên nhanh chóng để tiếp quản mã vào ứng dụng của tôi tuy nhiên dẫn đến một 'StackOverflowError'. Tôi sẽ xem xét điều này vào buổi tối. Cảm ơn! –
Lệnh copyFor là khóa nếu không mã JavaFX sẽ sao chép nội bộ sự kiện để đặt nguồn và đích, vì vậy bạn sẽ kết thúc trong vòng lặp vô tận của sự kiện remapping, chuyển đổi công cụ sửa đổi và tắt, dẫn đến tràn. Hệ thống thử nghiệm của tôi là OS X với Java 8. – jewelsea
Bằng cách nào đó, trong ứng dụng của tôi không có sự kiện nào bị loại bỏ khỏi danh sách 'mappedEvents'. Ví dụ của bạn hoạt động tốt. Tôi không thể tìm ra điều gì làm nên sự khác biệt cho đến nay. –