按下ENTER键时,我在理解JavaFX ComboBox的事件行为时遇到问题。
我在场景上添加了一个事件处理程序和事件过滤器,并在KeyEvent.KEY_RELEASED
上监听组合框。
请参阅以下示例代码:
ComboBox<String> cb = new ComboBox<>();
cb.getItems().addAll("Test", "hello", "world");
cb.addEventFilter(KeyEvent.KEY_RELEASED, event -> System.out.println("combobox filter"));
cb.addEventHandler(KeyEvent.KEY_RELEASED, event -> System.out.println("combobox handler"));
VBox root = new VBox(cb);
Scene scene = new Scene(root);
scene.addEventFilter(KeyEvent.KEY_RELEASED, event -> System.out.println("scene filter"));
scene.addEventHandler(KeyEvent.KEY_RELEASED, event -> System.out.println("scene handler"));
当组合框被聚焦并且我按下一些字母键时,我得到了这个结果:
scene filter
combobox filter
combobox handler
scene handler
这是预期的行为。首先,从上到下调用过滤器。之后,处理程序从下到上执行。这很好。但是当我按下ENTER键时,我得到以下结果:
scene filter
combobox filter
scene filter
scene handler
combobox handler
我不明白这种行为。
关于我实际尝试实施的内容的一些判断: 我们有一个表格对话框。要求是在用户按下ENTER键时关闭对话框,除非此时打开了ComboBox。在这种情况下,只应关闭ComboBox,但对话框应保持打开状态。
我试图在关闭ENTER对话框的场景中使用EventHandler来实现它。在ComboBox上我添加了一个消耗该事件的EventFilter。问题是即使我在comboBox的eventFilter中使用了事件,由于描述的行为,场景中的eventHandler仍然被执行。