2016-08-17 53 views
1

在我的代码中,我自定义了一个DefaultTreeCellRenderer以给我的节点一个自定义图标。Java JTree自定义图标在编辑树单元格时变回默认图标

setCellRenderer(new DefaultTreeCellRenderer() { 
      private static final long serialVersionUID = -2839238218110688876L; 
      private ImageIcon icon = myIcon; 

      @Override 
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) { 
       super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, hasFocus); 
       Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); 
       setIcon(icon); 
       return c; 
      } 
     }); 

所有这一切,直到我做了我的树可编辑,以便用户可以编辑节点标识工作就好了。现在,在编辑节点时,图标会切换回默认值。看起来编辑树单元格渲染器与我编写的单元渲染器不一样。有谁知道如何解决这一问题?

+0

? –

+0

我没有使用TreeCellEditor。 – CodeJ

+0

[您如何将JPanel的组件作为JTree中的节点使用?](http://stackoverflow.com/questions/31375773/how-do-you-make-components-of-jpanel-as-a -nt-in-jtree-usable) –

回答

2

使用setLeafIcon(Icon),setOpenIcon(Icon)setClosedIcon(Icon)DefaultTreeCellRenderer的方法可能更简单。

import java.awt.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class TreeIconTest { 
    private final Icon icon = new Icon() { 
    @Override public void paintIcon(Component c, Graphics g, int x, int y) { 
     Graphics2D g2 = (Graphics2D) g.create(); 
     g2.translate(x, y); 
     g2.setPaint(Color.RED); 
     g2.fillRect(1, 1, getIconWidth() - 2, getIconHeight() - 2); 
     g2.dispose(); 
    } 
    @Override public int getIconWidth() { 
     return 16; 
    } 
    @Override public int getIconHeight() { 
     return 16; 
    } 
    }; 
    public JComponent makeUI() { 
    JTree tree1 = new JTree(); 
    tree1.setEditable(true); 
    tree1.setCellRenderer(new DefaultTreeCellRenderer() { 
     @Override 
     public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean selected, boolean expanded, 
      boolean isLeaf, int row, boolean focused) { 
     JLabel c = (JLabel) super.getTreeCellRendererComponent(
      tree, value, selected, expanded, isLeaf, row, focused); 
     c.setIcon(icon); 
     return c; 
     } 
    }); 

    JTree tree2 = new JTree(); 
    tree2.setEditable(true); 
    DefaultTreeCellRenderer renderer2 = new DefaultTreeCellRenderer(); 
    renderer2.setOpenIcon(icon); 
    renderer2.setClosedIcon(icon); 
    renderer2.setLeafIcon(icon); 
    tree2.setCellRenderer(renderer2); 

    JTree tree3 = new JTree(); 
    tree3.setEditable(true); 
    tree3.setCellRenderer(new DefaultTreeCellRenderer() { 
     @Override public Icon getOpenIcon() { 
     return icon; 
     } 
     @Override public Icon getClosedIcon() { 
     return icon; 
     } 
     @Override public Icon getLeafIcon() { 
     return icon; 
     } 
    }); 
    tree3.setCellEditor(new DefaultTreeCellEditor(
     tree3, (DefaultTreeCellRenderer) tree3.getCellRenderer())); 

    JPanel p = new JPanel(new GridLayout(1, 3)); 
    p.add(new JScrollPane(tree1)); 
    p.add(new JScrollPane(tree2)); 
    p.add(new JScrollPane(tree3)); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new TreeIconTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
`TreeCellEditor`您正在使用什么
+0

非常感谢!这解决了我的问题! – CodeJ