JTableのセル内に配置したJCheckBoxをクリックして行の高さの展開・折り畳みを実行する
Total: 1133, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTableのセル内にJCheckBoxを配置し、これをクリックしたらとなりのセルの推奨サイズまで行の高さを展開します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
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の行の高さを変更する
- 実際の行の高さの展開・折り畳みは