【问题标题】:JavaFX TreeView: remove expand / collapse button (disclosure node) & functionalityJavaFX TreeView:删除展开/折叠按钮(披露节点)和功能
【发布时间】:2015-01-07 21:30:09
【问题描述】:

我想要一个 TreeView,它的所有子项都永久展开,并且我不希望用户能够展开或折叠任何子项。

为此,我发现我需要执行以下操作:

即使图标不再可见,它仍然可以点击。我看不出有任何过滤方法;我只看到了能够在事后做出回应的方法。

另外,如果我缺少确保此功能所需的任何其他操作,请告诉我。

【问题讨论】:

  • 树项目是否有任何功能(即可以通过一些自定义操作单击它们)?
  • 是的;我实现了一个自定义 TreeCell 并将其设置为我的单元工厂。我不关心能够开始/取消/提交编辑,因为我的每个 TreeCell 的图形都是一个 FlowPane,其中包含用于单元格显示的各种底层模型的各种 ComboBox 和其他控件。我仍然希望他们能够点击、突出显示和拖动。
  • 有没有办法用 CSS 移除折叠按钮的整个点击阶段?我什至会在这一点上解决这个问题......
  • CSS 只是定义了视图,但你想改变行为。如果你能提供你自己的皮肤实现......TreeCellSkin 扩展了TreeCellBehavior,最后,它是处理通过handleClickshandleDisclosureNode 的所有点击的类。但我不确定你想去那里......

标签: javafx treeview collapse disabled-control disclosure


【解决方案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 中,我可以阻止它。对于您的其余代码,它可能已经被禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多