【发布时间】:2016-07-26 22:49:16
【问题描述】:
我试图在 TableView 的 TableRow 上有一个 KeyEvent 处理程序,但该处理程序没有被调用。我知道可以在 TableView 上注册处理程序并使用 selectionmodel/focus 模型来获取选定或聚焦的项目,但我想为特定用例在行上注册一个键事件。 onKeyPressed 事件的文档说,
Defines a function to be called when this Node or its child Node has input focus and a key has been pressed. The function is called only if the event hasn't been already consumed during its capturing or bubbling phase.
表格行没有收到事件,因为其他一些节点已经消费了它?
有没有办法让事件触发到桌面? 这是我正在使用的代码
table.setRowFactory(tv -> {
TableRow<MyObject> row = new TableRow<>();
row.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
// TODO Auto-generated method stub
System.out.println(" In the key event");
}
});
【问题讨论】:
-
看起来表格行在您选择它后立即将键盘焦点的所有权转让给表格视图。由于表格行本质上从来没有键盘焦点,因此它不会接收按键事件。
-
我们可以通过扩展 tablerow 类并修改代码的某些部分以某种方式捕获 tablerow 上的事件吗?有什么建议/想法要我试一试吗?
-
两个想法,我都不喜欢:让每一行在表格视图上注册一个键处理程序,如果选择了该行,则在带有该事件的表格行上调用
fireEvent(可能该事件需要针对其目标和源进行适当的修改,并且您需要确保不会进入无限循环,因为触发的事件可能随后由表视图处理)。或者,在表格上使用侦听器或自定义外观以允许表格行获得焦点。 (也许用table.focusedProperty()注册监听器,如果它被选中,则将焦点放在该行上......?)。 -
我这就是你的意思,当你说,'让每一行在表格视图上注册一个键处理程序'?
table.setRowFactory(tv -> { TableRow<MyObject> tableRow = new TableRow<MyObject>(); tableRow.addEventHandler(KeyEvent.ANY, new EventHandler<Event>() {@Override public void handle(Event event) { System.out.println("in the event handler "); } }); tableRow.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<Event>() { @Override public void handle(Event event) { System.out.println("in the event filter" + tableRow.isSelected()); } }); -
不,我的意思是“在桌子上查看”。您正在表 row 上注册处理程序,该处理程序不会被调用,因为该行没有获得焦点。也许只有一种更好的方法来解决您的用例。为什么你(认为你)需要将关键处理程序放在行上,而不是放在桌子上?
标签: tableview javafx-8 fxml tablerow onkeypress