我有一个替代树实现,因为Treeview
没有做我需要它做的事情。除了一件事之外,它的效果很好:event handling
。
树由逻辑嵌套对象组成,每个对象使用大量hbox,vbox,标签等表示。
当您使用树时,您想要注册您的event handlers on the root of the tree
并拦截所有事件,但是这没有足够的上下文信息。
您可能会从某个实例化标签中获取鼠标单击事件,但无法检查它对应的树中的哪个项目。构建树时,每个对象的容器可以拦截事件并“增强”它们以提供新的上下文信息,但我不知道如何执行此操作。
copyFor()
无用,因为在您触发事件时它会再次被覆盖。那么如何处理MouseEvent.ANY
和KeyEvent.ANY
以及add a minimum amount of context?
Am I forced to create my own events?
更新
例如,如果我们有树:
A
B
C
在GUI元素中,它可能如下所示:
VBox(A)
HBox(A)
Icon(A)
Label(A)
VBox(B)
HBox(B)
Icon(B)
Label(B)
VBox(C)
...
所有事件处理程序都可以在此处的A的根VBox上注册。但是假设某人点击了Label(B)元素,根监听器只会看到原始元素是Label。然而,作为倾听者,您想要知道它与B链接。
答案 0 :(得分:2)
IMO您可以利用label / container / treeitem / tree的Node.setUserData()
方法来保存其相关的上下文数据。然后首先通过获取所需事件的源节点和目标节点来使用它。否则,您可能必须创建自己的活动。