概要

JTableの幅が一定以下の場合は列幅を維持して水平スクロールバーを表示し、それ以上になる場合は列幅の自動調整を実行してJTableの幅まで拡張するよう設定します。

スクリーンショット

Swing/ScrollableTracksViewportWidth.png

サンプルコード

JTable table3 = new JTable(1, 3) {
  @Override public boolean getScrollableTracksViewportWidth() {
    // default: return !(autoResizeMode == AUTO_RESIZE_OFF);
    // no longer work correctly???
    // return getPreferredSize().width < getParent().getWidth();
    Container parent = SwingUtilities.getUnwrappedParent(this);
    if (getPreferredSize().width < parent.getWidth()) {
      setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
    } else {
      setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    }
    return super.getScrollableTracksViewportWidth();
  }
};
View in GitHub: Java, Kotlin

解説

  • AUTO_RESIZE_SUBSEQUENT_COLUMNS(Default)
    • JTableのデフォルト
    • JTableの幅が変更された場合列幅の合計がJTableの幅と等しくなるよう各列を均等にサイズ変更
  • AUTO_RESIZE_OFF
    • JTableの幅が変更されても列幅の調整は自動的に行わず代わりに水平スクロールバーを使用
  • AUTO_RESIZE_OFF + getScrollableTracksViewportWidth()
    • JTable#getScrollableTracksViewportWidth()メソッドをオーバーライドし、JTableの幅に応じて列幅の自動調整を実行するかどうかを切り替えるよう設定
    • JTableの幅が一定以下に縮小された場合は列幅を維持して水平スクロールバーを使用
    • JTableの幅が一定以上に拡張された場合は列幅の自動調整を実行して列幅の合計がJTableの幅と等しくなるよう各列を均等にサイズ変更
      • 上記のサンプルではJTableの推奨サイズ幅で切り替えるよう設定

参考リンク

コメント