• category: swing folder: PlaceholderForEmptyTable title: JTableが空の場合、中央にJComponentを表示する tags: [JTable, JEditorPane, GridBagLayout, URL] author: aterai pubdate: 2010-09-13T11:14:48+09:00 description: JTableが空の場合、表領域の中央に任意のJComponentが表示されるように設定します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRDxbcszI/AAAAAAAAAgk/5iisfYFJom0/s800/PlaceholderForEmptyTable.png hreflang:
       href: https://java-swing-tips.blogspot.com/2010/09/placeholder-for-empty-jtable.html
       lang: en

概要

JTableが空の場合、表領域の中央に任意のJComponentが表示されるように設定します。

サンプルコード

JEditorPane hint = new JEditorPane("text/html", "<html><a href='dummy'>No data!</a></html>");

table.setFillsViewportHeight(true);
table.setLayout(new GridBagLayout());
table.add(hint);

model.addTableModelListener(new TableModelListener() {
  @Override public void tableChanged(TableModelEvent e) {
    DefaultTableModel model = (DefaultTableModel) e.getSource();
    hint.setVisible(model.getRowCount() == 0);
  }
});
View in GitHub: Java, Kotlin

解説

  • JTable#setFillsViewportHeight(true)として、JTableの高さがJViewportの高さより小さい場合、両者が同じ高さになるように設定
  • JTableのレイアウトをnullからGridBagLayoutに変更し、追加した編集不可のJEditorPaneが中央に配置されるよう設定
  • TableModelListener#tableChanged(...)イベントが発生したとき、モデルに行が存在するかどうかでJEditorPaneの表示・非表示を切り替え

コメント