【发布时间】:2020-07-12 04:57:13
【问题描述】:
通过这样做在 TreeTableView 的第 0 列上放置了一个“标准”编辑器:
treeTableView.columns.get(0).setCellFactory( TextFieldTreeTableCell.forTreeTableColumn());
...很高兴发现有几件事开始编辑TreeItem:一个是单击单元格,另一个是按 F2。
然而,令我有些沮丧的是,如果我启动应用程序并且没有使用鼠标选择 TreeItem,而是以编程方式选择了根 TreeItem 的第一个子项,如果我当时(可能在导航后仅使用键盘键)按 F2,JavaFX 内部抛出一个 NPE,如下所示:
java.lang.NullPointerException: null
at com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.activate(TableViewBehaviorBase.java:890)
at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$KeyHandler.process(Scene.java:4058)
at javafx.scene.Scene$KeyHandler.access$1500(Scene.java:4004)
at javafx.scene.Scene.processKeyEvent(Scene.java:2121)
at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2595)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$1(GlassViewEventHandler.java:248)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
at com.sun.glass.ui.View.handleKeyEvent(View.java:547)
at com.sun.glass.ui.View.notifyKey(View.java:971)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
不可能鼠标直接把焦点放在TreeItem上,因为TreeItem的超类是Object。我在Scene 上放置了一个焦点所有者监听器,它确认当您单击TreeTableView 时没有任何与焦点相关的变化。然而,从质量上来说,确实发生了一些变化。
也许这与 Behavior、InputMap、“皮肤”或我不知道的许多神秘 JavaFX 事物中的任何一种有关。
在这种情况下,在我看来,一种选择可能是以某种方式拦截 F2 击键,并阻止默认功能,并以编程方式发起对已选择但没有焦点的 TreeItem 的编辑。
注意,我在TreeTableView 上放置了一个“按下键”和“释放键”事件监听器。其中包括以下行:
TreeTablePosition pos = treeTableView.getFocusModel().getFocusedCell();
我所描述的“异常”事件(JavaFX 内部抛出 NPE)的特点是,在“密钥释放”侦听器中,pos.col == -1 和 pos.getTableColumn() == null。我还可以从日志记录中看出,NPE 发生在“密钥释放”处理程序响应之前。
有关信息,当我按下 F2 时,“按键”侦听器从不记录任何内容,而没有先用鼠标单击 TreeItem(毫无疑问,JavaFX 内部的 Exception 会扼杀对侦听器的正常“广播”) ,导致我假设 JavaFX 框架也位于任何用户添加的按键侦听器之前。
【问题讨论】:
标签: java javafx treeview edit treetableview