JavaFX TreeView:删除展开/折叠按钮(公开节点)和功能

JavaFX TreeView: remove expand / collapse button (disclosure node) & functionality

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

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

虽然图标不再可见,但仍可点击。我看不到任何过滤方法;我只看到事后能够回应的方法。

此外,如果我遗漏了确保此功能需要做的任何其他事情,请告诉我。

避免修改皮肤或默认行为的解决方案更简单,如果我们在发送点击之前捕获点击,并使用正确的点击。

为此,我们可以使用 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(); 
}

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

编辑

添加到事件调度器class用户使用键盘遍历树视图的情况,使用箭头LEFTRIGHT消耗collapse/expand事件.

我觉得很傻。我认为这主要是不知道那个该死的箭头叫什么的问题。显然这是一个披露节点?也许这是常识。

在自定义的 TreeCell 中,我所做的就是在 updateItem 方法中添加这一行:

setDisclosureNode(null);