2016-08-17 2 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

TreeCellEditor를 사용하고 있지 않습니다. – CodeJ

+0

[JTree에서 JPanel의 구성 요소를 사용할 수있는 노드를 어떻게 만들 수 있습니까?] (http://stackoverflow.com/questions/31375773/how-do-you-make-components-of-jpanel-as-a -node-in-jtree-usable) –

답변

2

간단 할 수 DefaultTreeCellRenderersetLeafIcon(Icon), setOpenIcon(Icon)setClosedIcon(Icon) 방법을 사용.

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); 
    }); 
    } 
} 
+0

정말 고마워요! 그게 내 문제를 해결 했어! – CodeJ