Developer'sWorks
Tips

テーブル行単位で背景色を変更する方法

テーブル行単位で背景色を変更するには、TableCellRenderer を作成しテーブルに設定する必要があります。
Webtribe,VisualFrameの TableCellRenderer は 列単位で同じオブジェクトを使用しているため、クラス内で 行番号(row) の内容により 処理を振り分ける必要があります。
TableCellRenderer とは、表示状態(セル編集中でない)の時の表示設定になりますので、編集中のセルの背景色は変わらないのに 注意してください
TableCellRenderer を作成するには、
jp.ne.mki.wedge.run.client.component.table.renderer.TextFieldRenderer を継承して下さい。
実装例としては以下になります。
import jp.ne.mki.wedge.run.client.component.table.renderer.TextFieldRenderer;
・・・(省略)・・・
public class ChangeColorRenderer extends TextFieldRenderer{
	public ChangeColorRenderer(Item item){
		super(item); //コンストラクタは、必ずアイテムを引数にして下さい。
	}

	/**
	 * レンダラコンポーネント取得
	 * @param JTable 対象テーブル
	 * @param Object 表示する値
	 * @param boolean 選択されているかどうか
	 * @param boolean フォーカスが当たっているかどうか
	 * @param int 対象行番号
	 * @param int 対象カラム番号
	 * @return Component レンダラコンポーネント
	 */
	public Component getTableCellRendererComponent(
			JTable	table,
			Object	value,
			boolean	isSelected,
			boolean	hasFocus,
			int	row,
			int	column){

		Component comp = super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
		
		((JLabel)comp).setOpaque(true); //背景色を反映するため不透過にする
		
		//選択行でない、フォーカスが当たっていないときには色を変更するかチェック
		//チェックOKの場合は背景色を変更する
		if(check(row,value)){
			comp.setBackground(Color.red);
		}
		else if(isSelected){
			comp.setForeground(table.getSelectionForeground());
			comp.setBackground(table.getSelectionBackground());
		}
		else{
			comp.setBackground(Color.white);
		}

		if(hasFocus){
			comp.setForeground(getFocusForegroundColor());
			comp.setBackground(getFocusBackgroundColor());
		}
		return comp;
	}
	
	
	/**
	 * 背景色変更チェック
	 * 値が 0 の場合に背景色を変更する。
	 * @param int 行番号
	 * @param String 値
	 * @return boolean 変更するか否か
	**/
	private boolean isCheck(int row,String value){
		if(value.equals("0")){
			return true;
		}
		else{
			return false;
		}
	}
}
super.getTableCellRendererComponent により、継承元で生成されたRendererを取得し、それに対して 背景色を設定します。
上記の例は、選択されている時(isSelected=true)、フォーカスが当たっている時(hasFocus=true)も考慮したコーディングに なっています。背景色を変えた行が選択行だった場合には、指定背景色の方を反映し、フォーカス取得セルのみ色を変える指定になっています。
これらの仕様は各自自由に変更してください。もし、選択行の色変更が必要でないのならば記述する必要は特にありません。
また、上記は TextFieldRenderer の例になります。その他のレンダラを使用したい場合には、以下のクラスを継承元に して作成して下さい。
  1. ボタンレンダラ
    jp.ne.mki.wedge.run.client.component.table.renderer.ButtonRenderer
  2. チェックボックスレンダラ
    jp.ne.mki.wedge.run.client.component.table.renderer.CheckBoxRenderer
  3. コンボボックスレンダラ
    jp.ne.mki.wedge.run.client.component.table.renderer.ComboBoxRenderer
全て、コンストラクタはItemを引数にして作成、super.getTableCellRendererComponent により、継承元で生成されたRendererを取得し それに対して変更を加える・・・という手順は同じになります。

このレンダラクラスをテーブルに反映する方法としては2種類あります。
  1. OMC:基本クラス の セルレンダラ に登録し、CAMC:テーブル にて割り当てる
    ※Ver1.0.3のみ
  2. ビジネスルールにて、セルレンダラを設定する
    int i = 1;
    JTable table = (JTable)item.getComponent();
    table.getColumnModel().getColumn(i).setCellRenderer(new ChangeColorRenderer(item));

-- 2003/08/18 Update