ツリーのセル制御


セル・レンダラ

ツリーのノード、すなわちセル項目もリストと同様に
専用のレンダラ・インターフェイスをもち、これがセルの描画を担当しています
レンダラは 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;
	}
}


このプログラムは、リーフの場合は専用アイコンを表示させ
選択されている場合は、赤い文字で選択状態であることを強調します
描画に使うコンポーネントにはラベルを採用しています



前のページへ戻る次のページへ