我想拥有一个永久扩展其所有子节点的TreeView,我不希望用户能够扩展或折叠任何子节点。
要做到这一点,我发现我需要做以下事情:
即使图标不再可见,它仍然可以点击。我没有看到任何过滤方法;我只看到了事后能够回应它的方法。
另外,如果我遗漏了确保此功能需要做的其他事情,请告知我们。
答案 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();
}
这将消耗树上箭头的任何点击(左或右)。
修改强>
向事件调度程序类添加了用户使用键盘遍历树视图的情况,使用箭头LEFT
或RIGHT
来消耗折叠/展开事件。