JavaFX TreeView:删除展开/折叠按钮(披露节点)和功能
Posted
技术标签:
【中文标题】JavaFX TreeView:删除展开/折叠按钮(披露节点)和功能【英文标题】:JavaFX TreeView: remove expand / collapse button (disclosure node) & functionality 【发布时间】:2015-01-07 21:30:09 【问题描述】:我想要一个 TreeView,它的所有子项都永久展开,并且我不希望用户能够展开或折叠任何子项。
为此,我发现我需要执行以下操作:
使用 CSS 移除图标(完成) Change expand and collapse image TreeView JavaFX 2.2 [编辑] 上面的链接应该用来改变图像;要完全删除,请使用此解决方案:https://***.com/a/27831191/4430591 删除双击功能(完成) Disable TreeItem's default expand/collapse on double click JavaFX 2.2 [编辑] 移除使用键盘箭头键折叠/展开的功能(完成) 在下面 José Pereda 的解决方案中给出 (https://***.com/a/27831085/4430591) [编辑] 删除右键单击上下文菜单的功能(完成) 在下面 José Pereda 的解决方案中给出 (https://***.com/a/27831085/4430591) 移除图标的可点击性(我该怎么做?) [编辑] 解决方案:https://***.com/a/27831191/4430591即使图标不再可见,它仍然可以点击。我看不出有任何过滤方法;我只看到了能够在事后做出回应的方法。
另外,如果我缺少确保此功能所需的任何其他操作,请告诉我。
【问题讨论】:
树项目是否有任何功能(即可以通过一些自定义操作单击它们)? 是的;我实现了一个自定义 TreeCell 并将其设置为我的单元工厂。我不关心能够开始/取消/提交编辑,因为我的每个 TreeCell 的图形都是一个 FlowPane,其中包含用于单元格显示的各种底层模型的各种 ComboBox 和其他控件。我仍然希望他们能够点击、突出显示和拖动。 有没有办法用 CSS 移除折叠按钮的整个点击阶段?我什至会在这一点上解决这个问题...... CSS 只是定义了视图,但你想改变行为。如果你能提供你自己的皮肤实现......TreeCellSkin
扩展了TreeCellBehavior
,最后,它是处理通过handleClicks
和handleDisclosureNode
的所有点击的类。但我不确定你想去那里......
【参考方案1】:
我觉得很傻。我认为这主要是不知道那个该死的箭头叫什么的问题。显然它是一个公开节点?也许这是常识。
在自定义的 TreeCell 中,我所做的只是在 updateItem 方法中添加这一行:
setDisclosureNode(null);
【讨论】:
嗨.. 如果您解释如何定义自定义 treeCell 会有点帮助【参考方案2】:如果我们在点击被分派之前捕获点击,并使用正确的点击,那么避免修改皮肤或默认行为的解决方案会更简单。
为此,我们可以使用EventDispatcher
来过滤鼠标按下和右键单击箭头,它们是StackPane
节点:
class CellEventDispatcher implements EventDispatcher
private final EventDispatcher original;
public CellEventDispatcher(EventDispatcher original)
this.original = original;
@Override
public Event dispatchEvent(Event event, EventDispatchChain tail)
if (event.getEventType().equals(MouseEvent.MOUSE_PRESSED) ||
event.getEventType().equals(ContextMenuEvent.ANY))
event.consume();
if(event instanceof KeyEvent && event.getEventType().equals(KeyEvent.KEY_PRESSED))
if((((KeyEvent)event).getCode().equals(KeyCode.LEFT) ||
((KeyEvent)event).getCode().equals(KeyCode.RIGHT)))
event.consume();
return original.dispatchEvent(event, tail);
现在我们将自定义调度程序应用到树视图:
@Override
public void start(Stage primaryStage)
TreeView<String> tree = new TreeView<>();
...
EventDispatcher treeOriginal = tree.getEventDispatcher();
tree.setEventDispatcher(new CellEventDispatcher(treeOriginal));
Scene scene = new Scene(tree);
primaryStage.setScene(scene);
primaryStage.show();
这将消耗树上箭头上的任何点击(左或右)。
编辑
将用户使用键盘遍历树视图的情况添加到事件调度程序类中,使用箭头LEFT
或RIGHT
使用折叠/展开事件。
【讨论】:
这不会创建一个场景,如果披露节点(小箭头)仍然存在(尽管在我的情况下可能不可见),用户将单击不可见按钮,并且鼠标单击事件将在没有选择 TreeItem 的情况下消费? 好吧,你能做的就是触发那个 treeItem 的动作(不过你必须找到哪个项目被点击了) 刚刚将用户使用键盘遍历树视图的情况添加到事件调度程序类中,使用箭头LEFT
或RIGHT
使用折叠/展开事件。
ContextMenuEvent.ANY 部分似乎不起作用。我让它打印它得到的每个事件和我看到的所有鼠标事件。我从来没有看到任何东西产生任何 ContextMenuEvents。 KeyEvent 部分非常有帮助
ContextMenuEvent 在您右键单击以显示可能的ContextMenu
时发生。在我简单的 sn-p 中,我可以阻止它。对于您的其余代码,它可能已经被禁用。以上是关于JavaFX TreeView:删除展开/折叠按钮(披露节点)和功能的主要内容,如果未能解决你的问题,请参考以下文章
winform, ListView Groups 下面的项目如何实现折叠,展开(默认都是展开) 类似treeview的效果