2016-08-17 4 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'を使用していますか? –

+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

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

ありがとう!それが私の問題を解決しました! – CodeJ

関連する問題