第一种方法:
你可以让你的RadioButtons not focusable。
通过此更改,箭头键的默认按键侦听器将不再更改收音机的状态,因为它们不会获得焦点(即使被鼠标选中):
classicModeButton.setFocusTraversable(false);
interestingModeButton.setFocusTraversable(false);
这只有在您的Scene 上没有其他可聚焦的Nodes 时才有效,否则他们将在事件处理程序处理关键事件之前处理它屏幕。如果您有其他节点,请检查第二种方法。
sn-p 示例:
// Init the variables
BooleanProperty interestingMode = new SimpleBooleanProperty(false);
RadioButton classicModeButton = new RadioButton("Classic");
RadioButton interestingModeButton = new RadioButton("Interesting");
ToggleGroup tg = new ToggleGroup();
classicModeButton.setToggleGroup(tg);
interestingModeButton.setToggleGroup(tg);
tg.selectToggle(classicModeButton);
// The radios should be not focusable
classicModeButton.setFocusTraversable(false);
interestingModeButton.setFocusTraversable(false);
// On toggle-change, the mode will be changed
interestingMode.bind(tg.selectedToggleProperty().isEqualTo(interestingModeButton));
// Just print the changes
tg.selectedToggleProperty().addListener((observable, oldValue, newValue) ->
System.out.println((newValue == interestingModeButton) ? "Hmm, interesting" : "Classic .. boring"));
scene.setOnKeyPressed(e ->
System.out.println((e.getCode().isArrowKey()) ? "Arrow pressed!" : "Other pressed, I don't care!"));
第二种方法:
您可以通过向Scene 和consume the event 添加event filter 而不是事件处理程序来处理键事件。这将捕获已经处于捕获阶段(而不是冒泡阶段)的事件,因此该事件甚至不会到达您的(可聚焦的)Nodes:
scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {
System.out.println((event.getCode().isArrowKey()) ? "Arrow pressed!" : "Other pressed, I don't care!");
event.consume();
});
这样,所有按键事件都会被捕获,当然也可以“让某些事件”通过。
有关事件如何传递的更多信息,请参见(例如)here。