TITLE:JTable自体の高さを拡張

JTable自体の高さを拡張

編集者:Terai Atsuhiro~

作成日:2007-08-20
更新日:2022-08-03 (水) 11:01:16
  • category: swing folder: FillsViewportHeight title: JTable自体の高さを拡張 tags: [JTable, JScrollPane, JViewport, JPopupMenu] author: aterai pubdate: 2007-08-20T11:28:51+09:00 description: JDK 6で導入された機能を使用して、JViewportの高さまでJTableを拡張します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTMkfiP8jI/AAAAAAAAAZY/qHWqJtrcUgQ/s800/FillsViewportHeight.png

概要

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

概要

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

サンプルコード

#spanend
#spanadd
JTable table = new JTable(model);
#spanend
#spanadd
table.setFillsViewportHeight(true);
#spanend

#spandel
#screenshot
#spanend
#spandel

#spanend
#spandel
**サンプルコード [#j4e564fb]
#spanend
#spandel
#code{{
#spanend
#spandel
table = new JTable(model) {
#spanend
  public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
    Component c = super.prepareRenderer(tcr, row, column);
    if(isRowSelected(row)) {
      c.setForeground(getSelectionForeground());
      c.setBackground(getSelectionBackground());
    }else{
      c.setForeground(getForeground());
      c.setBackground((row%2==0)?evenColor:oddColor);
    }
    return c;
  }
  public JPopupMenu getComponentPopupMenu() {
    return makePop();
  }
#spandel
};
#spanend
#spandel

#spanend
#spandel
JScrollPane scrollPane = new JScrollPane(table);
#spanend
#spandel
scrollPane.setBackground(Color.RED);
#spanend
#spandel
scrollPane.getViewport().setBackground(Color.GREEN);
#spanend
#spandel
table.setBackground(tablebgColor);
#spanend
#spandel
//table.setBackground(scrollPane.getBackground());
#spanend
#spandel

#spanend
#spandel
table.setComponentPopupMenu(new JPopupMenu());
#spanend
#spandel
//scrollPane.getViewport().setComponentPopupMenu(makePop());
#spanend
#spandel
//scrollPane.setComponentPopupMenu(makePop());
#spanend
#spandel

#spanend
#spandel
table.setRowSorter(new TableRowSorter<TableModel>(model));
#spanend
#spandel

#spanend
#spandel
Box box = Box.createHorizontalBox();
#spanend
#spandel
box.add(new JCheckBox(new AbstractAction("FillsViewportHeight") {
#spanend
  public void actionPerformed(ActionEvent evt) {
    JCheckBox cb = (JCheckBox)evt.getSource();
    table.setFillsViewportHeight(cb.isSelected());
  }
#spandel
}));
#spanend
#spandel
box.add(new JButton(new AbstractAction("clearSelection") {
#spanend
  public void actionPerformed(ActionEvent evt) {
    table.clearSelection();
  }
#spandel
}));
#spanend
#spanadd
JScrollPane scroll = new JScrollPane(table);
#spanend
#spanadd
scroll.setBackground(Color.RED);
#spanend
#spanadd
scroll.getViewport().setBackground(Color.GREEN);
#spanend
#spanadd
// table.setBackground(Color.BLUE);
#spanend
#spanadd
// table.setBackground(scroll.getBackground());
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

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

解説

上記のサンプルでは、チェックボックスの選択状態で、JTable#setFillsViewportHeight(boolean)を適用するかどうかを切り替えることができます。
  • (getFillsViewportHeight() == false) の場合(デフォルト値)
    • 下部の余白はJTableではないため、JViewportの背景色(緑)が表示される(JTableの背景色を変更)
    • JScrollPane、またはJViewportにsetComponentPopupMenuしたり、リスナーを設定していないため、下部の余白で右クリックしてもポップアップメニューは無効
  • getFillsViewportHeight() == false(デフォルト値)の場合
    • 下部の余白はJTableではないためJViewportの背景色(緑)が表示される
    • JScrollPane、またはJViewportsetComponentPopupMenu(...)JPopupMenuは未設定で、マウスリスナーも設定していないため下部の余白で右クリックしてもポップアップメニューは無効
  • (getFillsViewportHeight() == true) の場合
    • JTableの高さがJViewportの高さより小さい時は、両者が同じ高さになるようにJTableが拡張される
    • JTable#setBackgorund(Color)で設定した色(薄い黄色)がJTable下部の余白の背景色となる
    • JTable自体が拡張されるため、余白部分を右クリックしてもポップアップメニューが表示される
      • 縦スクロールバーとテーブルヘッダで出来る余白(赤)はJScrollPaneなので、ポップアップメニューは無効
    • 簡単に余白部分にドロップが可能になる(JTableの行をドラッグ&ドロップでは余白にドロップ出来ない)
  • getFillsViewportHeight() == trueの場合
    • JTableの高さがJViewportの高さより小さい時は両者が同じ高さになるようにJTableが拡張される
    • JTable#setBackground(Color)で設定した色(薄い黄色)がJTable下部の余白の背景色となる
    • JTable自体が拡張されるため余白部分を右クリックしてもポップアップメニューが表示される
      • 縦スクロールバーとテーブルヘッダで生成される余白(赤)などはJScrollPaneなので、ポップアップメニューは無効
    • 簡単に余白部分にドロップしたり、空のJTableにドロップが可能
ちなみに、JScrollPane、JViewportの背景色も以下のように表示されることがあるので、実際に使う場合はtable.setBackground(scrollPane.getBackground())するなどして、すべておなじ色になるようにしておいた方がいいかもしれません。

#screenshot(,screenshot2.png)

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

参考リンク

参考リンク

コメント

コメント