我有一个带有自定义 TreeModel 和自定义 TreeRenderer 的 JTree。树模型包含一堆不同类型的对象。 其中一种类型的显示方式与其他类型不同:显示的文本是对象的两个字段的串联。当我编辑单元格时,我想用编辑后的文本更新这些字段之一。到目前为止,我让它工作得很好。
我的问题:当编辑时显示的文本是 2 个字段的完整串联值,即使您实际上只是在编辑其中一个字段。所以我想在用户开始编辑时只显示您正在编辑的一个字段的内容。
我尝试使用自定义 CellEditor 执行此操作,并且我看到了它应该工作的方式,并且该方法在我的案例中似乎有些过分。在许多情况下,我只想更改显示的文本,所以我自然想要实现它,而不是为我的树的全部内容使用整个 CellEditor。
有没有更快更简单的方法来做到这一点,还是我必须使用自定义编辑器?
谢谢
最佳答案
没有绕过自定义编辑器的方法,它是可能的最短解决方案 :-) 此外,您需要在数据 领域中使用一些方法来适本地解释编辑值并更新本身,f.i.自定义节点。
F.i(稍后会评论它,我在这台机器上的蹩脚的 firefox 快把我逼上墙了)
/**
* Basic code stolen from @trashgod at
* @see http://stackoverflow.com/a/11113648/230513
*/
public class TreeEditDemo extends JPanel {
private JTree tree;
private DefaultMutableTreeNode root;
private DefaultTreeCellEditor editor;
public TreeEditDemo() {
super.setLayout(new GridLayout());
root = new DefaultMutableTreeNode("Nodes");
root.add(new MyResourceNode(new Resource("one", "first")));
root.add(new MyResourceNode(new Resource("two", "first")));
tree = new JTree(root);
tree.setEditable(true);
editor = new MyTreeCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer());
tree.setCellEditor(editor);
this.add(new JScrollPane(tree));
}
private static class MyTreeCellEditor extends DefaultTreeCellEditor {
public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
super(tree, renderer);
}
@Override
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
if (value instanceof MyResourceNode) {
value = ((MyResourceNode) value).getName();
}
return super.getTreeCellEditorComponent(tree, value, isSelected, expanded,
leaf, row);
}
@Override
public boolean isCellEditable(EventObject e) {
return super.isCellEditable(e)
&& ((TreeNode) lastPath.getLastPathComponent()).isLeaf();
}
}
public static class MyResourceNode extends DefaultMutableTreeNode {
/**
* @param resource
*/
public MyResourceNode(Resource resource) {
super(resource);
}
@Override
public void setUserObject(Object userObject) {
if (userObject instanceof String) {
setName((String) userObject);
} else if (userObject instanceof Resource) {
super.setUserObject(userObject);
}
}
public void setName(String name) {
if (getUserObject() != null) {
getUserObject().setName(name);
}
}
public String getName() {
if (getUserObject() != null) {
return getUserObject().getName();
}
return null;
}
@Override
public Resource getUserObject() {
return (Resource) super.getUserObject();
}
}
private static class Resource {
String name;
private String category;
public Resource(String name, String category) {
this.name = name;
this.category = category;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
// BEWARE: don't do this in production code!
return name + " (" + category + ")";
}
}
private void display() {
JFrame f = new JFrame("TreeEditorDemo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new TreeEditDemo().display();
}
});
}
}
关于java - 简单快速的 JTree 单元格编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642792/