概要

JDK 6で導入された機能を使用して、JViewportの高さまでJTableを拡張します。

サンプルコード

JTable table = new JTable(model);
table.setFillsViewportHeight(true);

JScrollPane scroll = new JScrollPane(table);
scroll.setBackground(Color.RED);
scroll.getViewport().setBackground(Color.GREEN);
// table.setBackground(Color.BLUE);
// table.setBackground(scroll.getBackground());
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、チェックボックスの選択状態で、JTable#setFillsViewportHeight(boolean)を適用するかどうかを切り替えることができます。

  • getFillsViewportHeight() == false(デフォルト値)の場合
    • 下部の余白はJTableではないためJViewportの背景色(緑)が表示される
    • JScrollPane、またはJViewportsetComponentPopupMenu(...)JPopupMenuは未設定で、マウスリスナーも設定していないため下部の余白で右クリックしてもポップアップメニューは無効
  • getFillsViewportHeight() == trueの場合
    • JTableの高さがJViewportの高さより小さい時は両者が同じ高さになるようにJTableが拡張される
    • JTable#setBackground(Color)で設定した色(薄い黄色)がJTable下部の余白の背景色となる
    • JTable自体が拡張されるため余白部分を右クリックしてもポップアップメニューが表示される
      • 縦スクロールバーとテーブルヘッダで生成される余白(赤)などはJScrollPaneなので、ポップアップメニューは無効
    • 簡単に余白部分にドロップしたり、空のJTableにドロップが可能

  • JTable#setFillsViewportHeight(true)を設定していてもJScrollPaneJViewportの背景色が以下のように表示される場合があるのでtable.setBackground(scrollPane.getBackground())などですべて同色揃えることも無意味ではない
FillsViewportHeight1.png
  • scrollPane.setBackground(Color.RED)
    • 縦スクロールバーとテーブルヘッダで生成される余白の色
  • scrollPane.getViewport().setBackground(Color.GREEN)
    • 列をドラッグして移動する場合の隙間の色
    • JTable#setAutoResizeMode(JTable.AUTO_RESIZE_OFF)としたときの右余白

参考リンク

コメント