Swing/CheckedRowColor のバックアップの現在との差分(No.16)
- category: swing folder: CheckedRowColor title: JTableのセルにJCheckBoxを表示して行背景色を変更 tags: [JTable, JCheckBox, TableModelListener, TableCellRenderer, TableCellEditor] author: aterai pubdate: 2008-07-14T14:18:45+09:00 description: JTableのセルに表示されているJCheckBoxがチェックされていれば、その行の背景色を変更します。 image:
概要
概要
JTable
のセルに表示されているJCheckBox
がチェックされていれば、その行の背景色を変更します。
Screenshot
Advertisement
サンプルコード
サンプルコード
JTable table = new JTable(model) {
@Override public Component prepareEditor(
TableCellEditor editor, int row, int column) {
Component cmp = super.prepareEditor(editor, row, column);
if (convertColumnIndexToModel(column) == BOOLEAN_COLUMN) {
JCheckBox c = (JCheckBox) cmp;
c.setBackground(c.isSelected() ? Color.ORANGE : getBackground());
}
return cmp;
}
#spanadd
#spanend
@Override public Component prepareRenderer(
TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
Boolean isChecked = (Boolean) model.getValueAt(
convertRowIndexToModel(row), BOOLEAN_COLUMN);
c.setForeground(getForeground());
c.setBackground(isChecked ? Color.ORANGE : getBackground());
return c;
}
};
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTable
のprepareEditor
、prepareRenderer
をオーバーライドしてセルエディタや行の背景色を変更しています。
解説
上記のサンプルでは、JTable
のprepareEditor
、prepareRenderer
をオーバーライドして編集中のセルエディタ(JCheckBox
)や同じ行の背景色を変更しています。
- -
チェックボックスがクリックされてモデルが更新されると、デフォルトでは対応するセルのみ再描画されます。このサンプルでは対象セルだけではなく、そのセルが存在する行全体の背景色を変更しているので、
TableModelListener
でモデルの更新を検出し、以下のようにJTable#repaint(...)
を使って行を再描画しています。
- デフォルトのセルレンダラーの場合、例えばチェックボックスがクリックされてモデルが更新されるとその対応するセルのみ再描画さる
- このサンプルでは対象セルだけではなくそのセルが存在する行全体の背景色を変更しているので、
TableModelListener
でモデルの更新を検出し、以下のようにJTable#repaint(...)
メソッドを使って行を再描画model.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { if (e.getType() == TableModelEvent.UPDATE) { //rowRepaint(table, table.convertRowIndexToView(e.getFirstRow())); Rectangle r = table.getCellRect(table.convertRowIndexToView(e.getFirstRow()), 0, true); // rowRepaint(table, table.convertRowIndexToView(e.getFirstRow())); Rectangle r = table.getCellRect( table.convertRowIndexToView(e.getFirstRow()), 0, true); r.width = table.getWidth(); //table.repaint(); //table全体をリペイントするのは、すこし無駄なので table.repaint(r); //一行だけリペイント // table.repaint(); // table全体をリペイントする必要はないので table.repaint(r); // 一行だけリペイント } } });