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

时间:2015-01-07 21:30:09

标签: javafx treeview collapse disabled-control disclosure

我想拥有一个永久扩展其所有子节点的TreeView,我不希望用户能够扩展或折叠任何子节点。

要做到这一点,我发现我需要做以下事情:

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

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

2 个答案:

答案 0 :(得分:5)

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

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

setDisclosureNode(null);

答案 1 :(得分:1)

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

为此,我们可以使用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来消耗折叠/展开事件。