• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableが空の場合、中央にJComponentを表示する
#navi(../)
#tags()
#tags(JTable, JEditorPane, GridBagLayout, URL)
RIGHT:Posted by &author(aterai); at 2010-09-13
*JTableが空の場合、中央にJComponentを表示する [#rde6e8d9]
JTableが空の場合、表領域の中央に任意のJComponentが表示されるように設定します。
* JTableが空の場合、中央にJComponentを表示する [#rde6e8d9]
`JTable`が空の場合、表領域の中央に任意の`JComponent`が表示されるように設定します。

-&jnlp;
-&jar;
-&zip;
#download
#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTRDxbcszI/AAAAAAAAAgk/5iisfYFJom0/s800/PlaceholderForEmptyTable.png)

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTRDxbcszI/AAAAAAAAAgk/5iisfYFJom0/s800/PlaceholderForEmptyTable.png)
** サンプルコード [#qf7e20d3]
#code(link){{
JEditorPane hint = new JEditorPane("text/html", "<html><a href='dummy'>No data!</a></html>");

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

**解説 [#d4225e0d]
上記のサンブルでは、JTableに編集不可にしたJEditorPaneを追加し、以下のように設定して、常に中央にレイアウトされるように設定しています。
** 解説 [#d4225e0d]
上記のサンブルでは、`JTable`に編集不可にした`JEditorPane`を追加し、以下のように設定して、常に中央にレイアウトされるように設定しています。

-JTable#setFillsViewportHeight(true) として、JTableの高さがJViewportの高さより小さい場合、両者が同じ高さになるように設定
-JTableのレイアウトを null から、GridBagLayout に変更
- `JTable#setFillsViewportHeight(true)`として、`JTable`の高さが`JViewport`の高さより小さい場合、両者が同じ高さになるように設定
- `JTable`のレイアウトを`null`から、`GridBagLayout`に変更

追加したJEditorPaneの表示非表示の切り替えは、ポップアップメニューで行の追加削除を行ったとき、JTable#getRowCount()==0かどうかで判断しています。
#code{{
private class TablePopupMenu extends JPopupMenu {
  private final Action deleteAction = new AbstractAction("delete") {
    @Override public void actionPerformed(ActionEvent e) {
      JTable table = (JTable)getInvoker();
      DefaultTableModel model = (DefaultTableModel)table.getModel();
      int[] selection = table.getSelectedRows();
      if(selection==null || selection.length<=0) return;
      for(int i=selection.length-1;i>=0;i--) {
        model.removeRow(table.convertRowIndexToModel(selection[i]));
      }
      if(table.getRowCount()==0) editor.setVisible(true);
    }
  };
//......
}}
%%追加した`JEditorPane`の表示非表示の切り替えは、ポップアップメニューで行の追加削除を行ったとき、`JTable#getRowCount()==0`かどうかで判断しています。%% `TableModelListener`を使って行の追加削除を行ったときに`JEditorPane`の表示非表示を切り替えるように変更しました。

//#code{{
//private class TablePopupMenu extends JPopupMenu {
//  private final Action deleteAction = new AbstractAction("delete") {
//    @Override public void actionPerformed(ActionEvent e) {
//      JTable table = (JTable)getInvoker();
//      DefaultTableModel model = (DefaultTableModel)table.getModel();
//      int[] selection = table.getSelectedRows();
//      if(selection==null || selection.length<=0) return;
//      for(int i=selection.length-1;i>=0;i--) {
//        model.removeRow(table.convertRowIndexToModel(selection[i]));
//      }
//      if(table.getRowCount()==0) editor.setVisible(true);
//    }
//  };
////......
//}}

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

#comment