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,最后,它是处理通过handleClickshandleDisclosureNode 的所有点击的类。但我不确定你想去那里...... 【参考方案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(); 

这将消耗树上箭头上的任何点击(左或右)。

编辑

将用户使用键盘遍历树视图的情况添加到事件调度程序类中,使用箭头LEFTRIGHT 使用折叠/展开事件。

【讨论】:

这不会创建一个场景,如果披露节点(小箭头)仍然存在(尽管在我的情况下可能不可见),用户将单击不可见按钮,并且鼠标单击事件将在没有选择 TreeItem 的情况下消费? 好吧,你能做的就是触发那个 treeItem 的动作(不过你必须找到哪个项目被点击了) 刚刚将用户使用键盘遍历树视图的情况添加到事件调度程序类中,使用箭头LEFTRIGHT使用折叠/展开事件。 ContextMenuEvent.ANY 部分似乎不起作用。我让它打印它得到的每个事件和我看到的所有鼠标事件。我从来没有看到任何东西产生任何 ContextMenuEvents。 KeyEvent 部分非常有帮助 ContextMenuEvent 在您右键单击以显示可能的ContextMenu 时发生。在我简单的 sn-p 中,我可以阻止它。对于您的其余代码,它可能已经被禁用。

以上是关于JavaFX TreeView:删除展开/折叠按钮(披露节点)和功能的主要内容,如果未能解决你的问题,请参考以下文章

winform, ListView Groups 下面的项目如何实现折叠,展开(默认都是展开) 类似treeview的效果

C# TreeView 折叠/展开父选择

WPF TreeView 数据绑定隐藏/显示展开/折叠图标

Delphi TreeView 问题

WPF DataBound 树视图展开/折叠

winform 中treeview 展开和折叠首层节点时 切换显示图片,类似qq首层节点那样,点击之后箭头图片改变