---
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: http://java-swing-tips.blogspot.com/2010/09/placeholder-for-empty-jtable.html
    lang: en
---
* 概要 [#summary]
`JTable`が空の場合、表領域の中央に任意の`JComponent`が表示されるように設定します。

#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRDxbcszI/AAAAAAAAAgk/5iisfYFJom0/s800/PlaceholderForEmptyTable.png)

* サンプルコード [#sourcecode]
#code(link){{
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);
  }
});
}}

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

//* 参考リンク [#reference]
* コメント [#comment]
#comment
- 大変素晴らしいです。参考にさせていただきました。 -- &user(shuna); &new{2010-09-18 (土) 12:12:50};
-- ありがとうございます。どうもです。 -- &user(aterai); &new{2010-09-18 (土) 20:19:21};

#comment