Swing/AdjustRowHeightFillsViewport のバックアップ(No.14)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/AdjustRowHeightFillsViewport へ行く。
- 1 (2015-09-30 (水) 19:01:25)
- 2 (2015-09-30 (水) 21:16:53)
- 3 (2016-05-24 (火) 19:36:15)
- 4 (2016-05-26 (木) 01:01:37)
- 5 (2016-11-18 (金) 14:45:07)
- 6 (2017-03-28 (火) 15:47:02)
- 7 (2017-12-08 (金) 15:48:15)
- 8 (2018-02-24 (土) 19:51:30)
- 9 (2019-05-24 (金) 18:21:20)
- 10 (2021-02-18 (木) 06:58:39)
- 11 (2025-01-03 (金) 08:57:02)
- 12 (2025-01-03 (金) 09:01:23)
- 13 (2025-01-03 (金) 09:02:38)
- 14 (2025-01-03 (金) 09:03:21)
- 15 (2025-01-03 (金) 09:04:02)
- category: swing
folder: AdjustRowHeightFillsViewport
title: JTableの行高がJViewportの高さに合うまで調整する
tags: [JTable, JViewport, JScrollPane]
author: aterai
pubdate: 2015-07-13T02:32:20+09:00
description: JTableの各行の高さ変更することで行数などに変更があっても、JViewportに余白が発生しないように調整します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2015/09/adjust-height-of-every-row-in-jtable-to.html lang: en
Summary
JTable
の各行の高さ変更することで行数などに変更があっても、JViewport
に余白が発生しないように調整します。
Screenshot
Advertisement
Source Code Examples
JTable table = new JTable(model) {
int prevHeight = -1;
int prevCount = -1;
private void updateRowsHeight(JViewport vport) {
int height = vport.getExtentSize().height;
int rowCount = getModel().getRowCount();
int defaultRowHeight = height / rowCount;
if ((height != prevHeight || rowCount != prevCount) && defaultRowHeight > 0) {
// int remainder = height - rowCount * defaultRowHeight;
int remainder = height % rowCount;
for (int i = 0; i < rowCount; i++) {
int a = remainder > 0 ? i == rowCount - 1 ? remainder : 1 : 0;
setRowHeight(i, defaultRowHeight + a);
remainder--;
}
}
prevHeight = height;
prevCount = rowCount;
}
@Override public void doLayout() {
super.doLayout();
Container p = SwingUtilities.getAncestorOfClass(JViewport.class, this);
if (p instanceof JViewport) {
updateRowsHeight((JViewport) p);
}
}
};
View in GitHub: Java, KotlinExplanation
上記のサンプルでは、JViewport
のサイズまでJTable
の各セルをGridLayout
風に同比率で拡大縮小するようJTable#doLayout()
メソッドをオーバーライドしています。
- 余白(高さ方向)の調整
JViewport
の高さが変更されたり行数の増減が発生した場合、各行の高さをJTable#setRowHeight(...)
で設定し直すことでJViewport
に余白が生成されないように調整
JScrollPane
の高さだけ変更した場合、JTable#doLayout()
が呼び出されなくなった?JTable#setFillsViewportHeight(true)
を設定しても高さの拡大縮小でJTable#doLayout()
が呼び出されないJScrollPane
にComponentListener
を追加して回避scroll.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { Component c = e.getComponent(); if (c instanceof JScrollPane) { ((JScrollPane) c).getViewport().getView().revalidate(); } } });