我正在显示自定义对象树,并且设置了自定义 CellTreeEditor
和 CellTreeRenderer
。
现在我真正想要的是始终像“编辑模式”一样显示所有对象。现在,我的 CellTreeRenderer.getTreeCellRendererComponent()
和 CellTreeEditor.getTreeCellEditorComponent()
实现几乎相同。这种方法可行,但我仍然必须单击一个节点来将其聚焦,然后才能进行任何编辑。
有没有更明智的方法来做到这一点,也许就像说永远不应该使用渲染器,默认为我的 CellTreeEditor
?
*****更新****
澄清一下:我有一棵树看起来像这样(是的,它看起来也像垃圾,但这不是重点):
现在,我通过拥有一个渲染器和一个从 getTreeCell[Renderer|Editor]Component() 返回相同组件的编辑器
来实现此目的。
如果我单击渲染器提供的组合框中的向下箭头,它会在打开下拉列表时轻微闪烁,但随后会被我的编辑器组件中断并替换。这意味着我必须再次单击它才能打开下拉菜单。这是我想避免的行为。
最佳答案
扩展我的评论:不,你不想让你的编辑器在单元格之间共享(讨厌的事情开始发生)相反,添加一个 TreeCellListener 来监听引导(又名:聚焦)选择路径的变化,然后显式地开始在该路径上进行编辑
final JXTree tree = new JXTree();
tree.setEditable(true);
tree.expandAll();
TreeSelectionListener l = new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
final TreePath path = e.getNewLeadSelectionPath();
if (path != null) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
tree.startEditingAtPath(path);
}
});
}
}
};
tree.addTreeSelectionListener(l);
真正使其工作的技巧是常见的:将自定义 react 包装到 invokeLater 中以确保树的内部更新完成
关于java - JTree,始终显示 "edit mode"中的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604095/