Swing/ResizingColumnAndTable のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ResizingColumnAndTable へ行く。
- category: swing folder: ResizingColumnAndTable title: JTableのリサイズで最後のTableColumnのみリサイズする tags: [JTable, JTableHeader, TableColumn] author: aterai pubdate: 2014-05-26T00:01:15+09:00 description: JTableがリサイズされた場合、最後にあるTableColumnがその幅の変更を吸収するように設定します。 image:
概要
JTable
がリサイズされた場合、最後にあるTableColumn
がその幅の変更を吸収するように設定します。主に、java - JTable columns doesnt resize probably when JFrame resize - Stack Overflowの回答からソースを引用しています。
Screenshot
Advertisement
サンプルコード
private final JTable table = new JTable(100, 3) {
//http://stackoverflow.com/questions/16368343/jtable-resize-only-selected-column-when-container-size-changes
//http://stackoverflow.com/questions/23201818/jtable-columns-doesnt-resize-probably-when-jframe-resize
@Override public void doLayout() {
Optional.ofNullable(getTableHeader()).ifPresent(h -> {
if (Objects.isNull(h.getResizingColumn()) && getAutoResizeMode() == AUTO_RESIZE_LAST_COLUMN) {
TableColumnModel tcm = getColumnModel();
h.setResizingColumn(tcm.getColumn(tcm.getColumnCount() - 1));
}
});
super.doLayout();
}
};
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JFrame
のリサイズに連動してJTable
、JTableHeader
もリサイズされた場合、最後のTableColumn
が幅の変更をすべて吸収するように、JTable#doLayout()
のオーバーライドやJTableHeader.setResizingColumn(...)
の設定を行なっています。
- 注:
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
を設定しても、例えば親JFrame
の幅が変更されて、JTableHeader
自体がリサイズされた場合、すべてのTableColumn
の幅が均等に変化してしまう- 列を入れ替えた場合でも、表示上最後にある
TableColumn
がリサイズされる チェックボックスで設定を切り替えているため、チェックボックスでの設定切り替えではなく、デフォルト設定のJTable
にComponentListener
を追加して、変更ごとにJTableHeader.setResizingColumn(null)
でリセットJTable
を追加し、これと二つ並べて表示するサンプルに変更- 以下のように、
JTable#doLayout()
をオーバーライドではなく、JTable
またはJTableHeader
にComponentListener
を追加しても同様の動作になるが、リサイズ開始時に最後のTableColumn
にも幅の変更が適用されてしまうため、微妙に幅が変化してしまう場合がある(先にJTable#doLayout()
が実行される)
JTable table2 = new JTable(100, 3);
table2.getTableHeader().addComponentListener(new ComponentAdapter() {
@Override public void componentResized(ComponentEvent e) {
JTableHeader tableHeader = (JTableHeader) e.getComponent();
if (tableHeader == null) {
return;
}
if (check.isSelected()) {
TableColumnModel tcm = tableHeader.getTable().getColumnModel();
int lastColumn = tcm.getColumnCount() - 1;
tableHeader.setResizingColumn(tcm.getColumn(lastColumn));
} else {
tableHeader.setResizingColumn(null);
}
}
});
参考リンク
- java - JTable columns doesnt resize probably when JFrame resize - Stack Overflow
- java - JTable resize only selected column when container size changes - Stack Overflow