我有一个附加了SelectionListener的JTree。只要我点击树中的节点,监听器就能正常运行并正确地通知我。
然而,节点不会在选中时突出显示。事实上,它需要两次点击才能获得视觉效果"蓝盒"在要显示的节点上。
为什么以下代码需要两次点击才能显示选择?
创建JTree
JTree tree = new JTree();
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setDragEnabled(true);
tree.setDropMode(DropMode.ON);
tree.expandRow(0);
tree.setModel(model.getActiveFilterModel());
添加监听器
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent event) {
JTree tree = (JTree) event.getSource();
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (selectedNode != null) {
model.setSelectedFilter((Filter) selectedNode.getUserObject());
}
}
});
编辑:
我想补充说,只有在我第二次在树上调用.setModel时才会出现这种情况。
答案 0 :(得分:1)
问题是我正在使用Observer模式并不断调用显示(例如,JTree,更新())。这本身不是问题。
但是,在我的更新调用中,当底层模型真正处理这些更改时,我一直在使用tree.setModel(...)。我将我的代码切换到只调用setModel()一次,现在一切都运行良好。