スキマハコ

わすれがちなスキマな事を詰め込んでいます。ITの他に暮らしについても書いています。

jtable内セルに上詰めなどを設定する

水平方向の位置決め。

	//列幅の設定
	DefaultTableColumnModel columnModel
		= (DefaultTableColumnModel)piw.tblplan.getColumnModel();
	//割合を決める感じ?
	columnModel.getColumn(0).setPreferredWidth(piw.tblplan.getColumnName(0).length()*35);
	columnModel.getColumn(1).setPreferredWidth(piw.tblplan.getColumnName(1).length()*10);
	columnModel.getColumn(2).setPreferredWidth(piw.tblplan.getColumnName(2).length()*35);
	    
	//中央揃え
	DefaultTableCellRenderer  ren1 = new DefaultTableCellRenderer();
	ren1.setHorizontalAlignment(JLabel.CENTER);
	ren1.setVerticalAlignment(JLabel.CENTER);
	columnModel.getColumn(0).setCellRenderer(ren1);

	//右詰め
	DefaultTableCellRenderer  ren2 = new DefaultTableCellRenderer();
	ren1.setHorizontalAlignment(JLabel.RIGHT);
	ren1.setVerticalAlignment(JLabel.RIGHT);
	columnModel.getColumn(1).setCellRenderer(ren2);

	//左詰め
	DefaultTableCellRenderer  ren3 = new DefaultTableCellRenderer();
	ren1.setHorizontalAlignment(JLabel.LEFT);
	ren1.setVerticalAlignment(JLabel.LEFT);
	columnModel.getColumn(2).setCellRenderer(ren3);

こんな風に水平方向の位置決めは結構簡単にできるんだけど、垂直方向はうまくいかない。
しかも以下の問題点あり。
・常に中央ぞろえ
・折り返し不可
(内部データにをかましても、半角英数字を入れると折り返しも無効になる。)
この点を挽回するにはレンダリングからいじってあげる必要があるらしい。

/* 元のTableCellRendererをほぼ流用した独自クラス(改行対応版) */
public class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {

	private TableCellRenderer renderer;
	
	public TextAreaCellRenderer(TableCellRenderer renderer) {
		this.renderer = renderer;
		//折り返し
		setLineWrap(true);
	}

	//セルを描画するのに使用されるコンポーネントを返します。
	//描画する前に、このメソッドを使ってレンダリングを適切に設定します
	public Component getTableCellRendererComponent(
	    JTable table, Object value, boolean isSelected, boolean hasFocus,
	    int row, int column) {

		//isSelected - セルがハイライトで描画されている場合は true、そうでない場合は false
		if(isSelected) {
			setForeground(table.getSelectionForeground());
			setBackground(table.getSelectionBackground());
		}else{
			setForeground(table.getForeground());
			setBackground(table.getBackground());
		}

		//レンダリングされるセルの値。値を解釈および描画する方法は、
		//特定のレンダリングによって異なる。たとえば、value が文字列 true の場合、
		//それは文字列として描画されるか、またはチェックされているチェックボックス
		//として描画される。null は有効な値
		setText((value == null) ? "" : value.toString());
	    Component c = renderer.getTableCellRendererComponent(table, value,
	              isSelected, hasFocus, row, column);

	    
	    //セル内の値表示位置を設定
	    JLabel jlabel = (JLabel)c;
	    jlabel.setHorizontalAlignment(JLabel.LEFT);
	    jlabel.setVerticalAlignment(JLabel.TOP);
		return this;
	}
}

いただいたソース。理解にはまだ及ばない…