0

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

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

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

此外,如果我遗漏了确保此功能所需的其他任何操作,请告诉我。

4

2 回答 2

5

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

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

setDisclosureNode(null);
于 2015-01-08T00:39:03.517 回答
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(); 
}

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

编辑

在事件调度程序类中添加了用户使用键盘遍历树视图的情况,使用箭头LEFT或使用折叠/展开事件RIGHT

于 2015-01-08T00:27:02.340 回答