ツリーのセル制御
セル・レンダラ
ツリーのノード、すなわちセル項目もリストと同様に
専用のレンダラ・インターフェイスをもち、これがセルの描画を担当しています
レンダラは javax.swing.tree.TreeCellRenderer を実装しなければなりません
public interface TreeCellRenderer
このインターフェイスは、ノードの描画時に呼び出されるメソッド
TreeCellRenderer.getTreeCellRendererComponent() を宣言しています
public Component getTreeCellRendererComponent(
JTree tree , Object value ,
boolean selected , boolean expanded , boolean leaf ,
int row , boolean hasFocus
)
tree にはこのメソッドを呼び出したツリーを、value にはセルを指定します
sekected はセルが選択されている場合は true を、そうでなければ false を指定します
expanded はノードが展開されているのであれば true
leaf は、ノードがリーフであれば true を指定します
row にはノードの行インデックスを指定します
hasFocus が true ならば、セルはフォーカスを保有しています
このメソッドは、セルとして描画するコンポーネントを返します
リスト同様に、このコンポーネントは描画を行うためだけに使用されます
レンダラの登録は JTree.setCellRenderer() メソッドを
レンダラの取得は JTree.getCellRenderer() メソッドを使います
public void setCellRenderer(TreeCellRenderer x)
public TreeCellRenderer getCellRenderer()
x には登録するレンダラを指定します
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class Test extends JApplet implements TreeCellRenderer {
public void init() {
String str1[] = {
"Kitty" , "Kitten" , "Pussy"
};
Hashtable node = new Hashtable();
node.put("Kitty on your lap" , str1);
JTree tree = new JTree(node);
tree.setCellRenderer(this);
getContentPane().add(new JScrollPane(tree));
}
public Component getTreeCellRendererComponent(
JTree tree , Object value , boolean selected ,
boolean expanded , boolean leaf , int row , boolean hasFocus
) {
JLabel label = new JLabel(value.toString());
if (leaf) {
label.setIcon(new ImageIcon("icon.jpg"));
if (selected) label.setForeground(Color.RED);
}
return label;
}
}
このプログラムは、リーフの場合は専用アイコンを表示させ
選択されている場合は、赤い文字で選択状態であることを強調します
描画に使うコンポーネントにはラベルを採用しています