自定义编辑器是没有办法的,它是最短的解决方案:-)另外,您将需要在 数据 领域中使用一些方法来解释编辑值,并通过自定义节点自行更新。
Fi(稍后会发表评论,我这台机器上的la脚的Firefox将我推向高墙)
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 { 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 pre! 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(); } }); }}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)