アイコンをレンダラー クラスにフィールドとして追加します。
このフィールドの値を変更して、JTree を再描画します。
class CustomTreeCellRenderer extends DefaultTreeCellRenderer{
ImageIcon rendererIcon;
public void setRendererIcon(ImageIcon myIcon){
this.rendererIcon = myIcon;
};
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus){
super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
JLabel label = (JLabel) this ;
label.setIcon( rendererIcon ) ;
return this;
}
}
編集:説明
あなたの場合、モデルを変更しても無駄です。各ノードの表示に使用されるアイコンは、レンダラーの一部です。
JTree のレンダラー オブジェクトは、強制的にJComponent
. JComponent
コードが を呼び出すときにを提供するオブジェクトである必要がありますgetTreeCellRendererComponent
。
DefaultTreeCellRenderer
あなたの場合、 getCellRenderer() の JLabel へのキャストは、のデフォルトの実装がの拡張であるため、単なる運ですJLabel
。
実際、レンダラーがそれ自体で setIcon を呼び出したので、 getIcon メソッドがレンダラーに配置した最後のアイコンを提供するのは正常です。
完全なコードの動作:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultTreeCellRenderer;
public class TestJTree {
private static ImageIcon iconWhite = new ImageIcon("white.jpg");
private static ImageIcon iconBlack = new ImageIcon("black.jpg");;
public static void main(String[] args) {
TestJTree me = new TestJTree();
me.process();
}
private void process() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
initGui();
}
});
}
protected void initGui() {
JFrame frame = new JFrame("Test JTree");
frame.setContentPane(new JPanel(new BorderLayout()));
final JTree tree = new JTree();
frame.getContentPane().add(tree);
final CustomTreeCellRenderer renderer = new CustomTreeCellRenderer();
renderer.setRendererIcon(iconWhite);
tree.setCellRenderer(renderer);
JPanel panelButtons = new JPanel();
JButton buttonWhite = new JButton("");
buttonWhite.setIcon(iconWhite);
JButton buttonBlack = new JButton("");
buttonBlack.setIcon(iconBlack);
buttonBlack.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
renderer.setRendererIcon(iconBlack);
tree.repaint();
}
});
panelButtons.add(buttonBlack);
panelButtons.add(buttonWhite);
frame.getContentPane().add(panelButtons,BorderLayout.SOUTH);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
}
@SuppressWarnings("serial")
private static class CustomTreeCellRenderer extends DefaultTreeCellRenderer{
ImageIcon rendererIcon;
public void setRendererIcon(ImageIcon myIcon){
this.rendererIcon = myIcon;
};
public Component getTreeCellRendererComponent(JTree tree,
Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus){
Component ret = super.getTreeCellRendererComponent(tree, value,
selected, expanded, leaf, row, hasFocus);
JLabel label = (JLabel) ret ;
label.setIcon( rendererIcon ) ;
return ret;
}
}
}