Swing/TableCellExpandCollapseOnClick のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableCellExpandCollapseOnClick へ行く。
- 1 (2023-05-08 (月) 00:01:01)
- 2 (2023-05-09 (火) 12:21:52)
- 3 (2023-07-01 (土) 01:06:20)
- category: swing folder: TableCellExpandCollapseOnClick title: JTableのセル内に配置したJCheckBoxをクリックして行の高さの展開・折り畳みを実行する tags: [JTable, TableCellEditor, TableCellRenderer, JCheckBox] author: aterai pubdate: 2023-05-08T00:00:19+09:00 description: JTableのセル内にJCheckBoxを配置し、これをクリックしたらとなりのセルの推奨サイズまで行の高さを展開します。 image: https://drive.google.com/uc?id=16vOMLYeg5yf607l6d6z-mU1d6GMU96m2
概要
JTable
のセル内にJCheckBox
を配置し、これをクリックしたらとなりのセルの推奨サイズまで行の高さを展開します。
Screenshot
Advertisement
サンプルコード
int defaultHeight = 20;
JTable table = new JTable(model) {
@Override public void updateUI() {
super.updateUI();
setAutoCreateRowSorter(true);
setSurrendersFocusOnKeystroke(true);
setRowHeight(defaultHeight);
setDefaultRenderer(RowHeader.class, new RowHeaderRenderer());
setDefaultEditor(RowHeader.class, new RowHeaderEditor());
TableColumn column = getColumnModel().getColumn(1);
column.setCellRenderer(new TextAreaCellRenderer());
column.setPreferredWidth(160);
}
};
table.getModel().addTableModelListener(e -> {
int mc = e.getColumn();
int mr = e.getFirstRow();
int vc = table.convertColumnIndexToView(mc);
int vr = table.convertRowIndexToView(mr);
Object o = table.getValueAt(vr, vc);
if (mc == 0 && o instanceof RowHeader) {
RowHeader rh = (RowHeader) o;
int vc1 = table.convertColumnIndexToView(1);
TableCellRenderer r = table.getColumnModel().getColumn(vc1)
.getCellRenderer();
Object v = table.getValueAt(vr, vc1);
Component c = r.getTableCellRendererComponent(
table, v, true, true, vr, vc1);
int h = rh.isSelected() ? c.getPreferredSize().height
: defaultHeight;
table.setRowHeight(vr, h);
}
});
View in GitHub: Java, Kotlin解説
0
列目- 「タイトル文字列」、「展開・折り畳み可能か」、「現在展開されているか」の
3
つのデータを保持するRowHeader
クラスをColumnClass
として設定 JTable#setDefaultRenderer(RowHeader.class, new RowHeaderRenderer())
でRowHeader
クラスのセルレンダラを設定JTable#setDefaultEditor(RowHeader.class, new RowHeaderEditor())
でRowHeader
クラスのセルエディタを設定- 共にタイトル用の
JLabel
と展開・折り畳み用のJCheckBox
を配置したJPanel
を使用 JCheckBox
の選択アイコンは∧
、未選択状態アイコンは∨
の文字表示に変更
- 「タイトル文字列」、「展開・折り畳み可能か」、「現在展開されているか」の
1
列目- 複数行の文字列を表示可能な
JTextArea
をセルレンダラとして設定 TableCellRenderer#getTableCellRendererComponent(...)
内でJTextArea
に文字列を設定し、かつJTextArea
の幅を現在の列のセル幅と同じになるよう設定することでJTextArea
の推奨サイズが計算可能になる
- 複数行の文字列を表示可能な
TableModelListener
- 実際の行の高さの展開・折り畳みは
RowHeader
の選択状態が変化してTableModelEvent
が発生したときにJTable#setRowHeight(...)
メソッドで実行する - JTableの行の高さを変更する
- 実際の行の高さの展開・折り畳みは