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

-&jnlp;
-&jar;
-&zip;

#screenshot
//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTRDxbcszI/AAAAAAAAAgk/5iisfYFJom0/s800/PlaceholderForEmptyTable.png)

**サンプルコード [#qf7e20d3]
#code{{
#code(link){{
table.setFillsViewportHeight(true);
table.setLayout(new GridBagLayout());
table.add(hint);
}}

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

-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);
    }
  };
//......
}}

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

#comment