我想要一个TreeView,它的所有子程序都是永久展开的,我不希望用户能够展开或折叠任何一个子级。
要做到这一点,我发现我需要做以下工作:
即使图标不再可见,它仍然可以点击。我看不出有什么方法可以过滤它;我只看到了在事实发生后才能对它作出反应的方法。
此外,如果我缺少任何其他我需要做的,以确保这个功能,请让我知道。
发布于 2015-01-08 00:39:03
我觉得很傻。我想这主要是因为不知道那该死的箭是怎么回事。很明显是disclosureNode?也许这是常识。
在自定义的TreeCell中,我所做的就是在updateItem方法中添加这一行:
setDisclosureNode(null);
发布于 2015-01-08 00:27:02
避免修改皮肤或默认行为的解决方案更简单,如果我们在发出单击之前捕获它们,并使用正确的单击。
为此,我们可以使用一个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();
}
这将消耗对树上箭头的任何单击(左或右)。
编辑
添加到events类中的情况是,用户使用键盘遍历树视图,使用箭头LEFT
或RIGHT
使用折叠/展开事件。
https://stackoverflow.com/questions/27828982
复制相似问题