Swing/CheckedRowColor のバックアップの現在との差分(No.8)
TITLE:JTableのセルにJCheckBoxを表示して行背景色を変更
Posted by aterai at 2008-07-14
JTableのセルにJCheckBoxを表示して行背景色を変更
JTableのセルに表示されているJCheckBoxがチェックされていれば、その行の背景色を変更します。- 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
がチェックされていれば、その行の背景色を変更します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
model.addTableModelListener(new TableModelListener() {
#spanend
@Override public void tableChanged(TableModelEvent e) {
if(e.getType()==TableModelEvent.UPDATE) {
rowRepaint(table, table.convertRowIndexToView(e.getFirstRow()));
}
}
#spandel
});
#spanend
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());
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());
c.setBackground(isChecked ? Color.ORANGE : getBackground());
return c;
}
};
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTableのprepareEditor、prepareRendererをオーバーライドしてセルエディタや行の背景色を変更しています。解説
上記のサンプルでは、JTable
のprepareEditor
、prepareRenderer
をオーバーライドして編集中のセルエディタ(JCheckBox
)や同じ行の背景色を変更しています。
- デフォルトのセルレンダラーの場合、例えばチェックボックスがクリックされてモデルが更新されるとその対応するセルのみ再描画さる
- このサンプルでは対象セルだけではなくそのセルが存在する行全体の背景色を変更しているので、
TableModelListener
でモデルの更新を検出し、以下のようにJTable#repaint(...)
メソッドを使って行を再描画#spanend #spanadd model.addTableModelListener(new TableModelListener() { #spanend @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); r.width = table.getWidth(); // table.repaint(); // table全体をリペイントする必要はないので table.repaint(r); // 一行だけリペイント } } #spanadd }); #spanend #spanadd
参考リンク
参考リンク
コメント
- ごちそうさまでした。 -- tanuchan?
- まいどありです。 -- aterai
- メモ: Bug ID: 6711682 JCheckBox in JTable: checkbox doesn't alaways respond to the first mouse click -- aterai
コメント
- ごちそうさまでした。 -- tanuchan
- まいどありです。 -- aterai
- メモ: Bug ID: 6711682 JCheckBox in JTable: checkbox doesn't alaways respond to the first mouse click -- aterai