TITLE:JTableのセルにJButtonを追加して行削除
#navi(../)
*JTableのセルにJButtonを追加して行削除 [#y5a20522]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2007-10-22~
更新日:&lastmod;

#contents

**概要 [#h2e5f852]
JTableのセルにJButtonを追加し、クリックされたらその行を削除します。主に[[Swing - JButton inside JTable Cell>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=680674]]の投稿を参考にしています。

#screenshot

**サンプルコード [#i9dca28f]
#code{{
class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {
  private static final String LABEL = "...";
  private final JButton renderButton = new JButton(LABEL);
  private final JButton editorButton;
  public ButtonColumn() {
    super();
    editorButton = new JButton(new AbstractAction(LABEL) {
    public void actionPerformed(ActionEvent e) {
        fireEditingStopped();
      }
    });
    editorButton.setFocusPainted( false );
    editorButton.setRolloverEnabled(false);
    //renderButton.setToolTipText("Delete(renderButton)");
    //editorButton.setToolTipText("Delete(editorButton)");
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
                      boolean isSelected, boolean hasFocus, int row, int column) {
    return renderButton;
  }
  public Component getTableCellEditorComponent(JTable table, Object value,
                      boolean isSelected, int row, int column) {
    return editorButton;
  }
  public Object getCellEditorValue() {
    return LABEL;
  }
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#qcbd9c4d]
上記のサンプルでは、ボタンがクリックされたときの削除自体は、JTableに追加したマウスリスナーで行っており、セルエディタやセルレンダラーに使っているJButtonは表示のためのダミーです。

複数選択を許可しない場合は、[[Swing - JButton inside JTable Cell>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=680674]]のように、セルエディタにリスナーを追加し、選択されたセルを削除する方法もあります。
#code{{
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
editorButton = new JButton(new AbstractAction(LABEL) {
  public void actionPerformed(ActionEvent e) {
    fireEditingStopped();
    int row = table.convertRowIndexToModel(table.getSelectedRow());
    ((DefaultTableModel)table.getModel()).removeRow(row);
  }
});
}}
複数選択を許可する場合は、Shiftキーを押しながらのボタンクリックなどに注意する必要があります。

**参考リンク [#kcf3a9d4]
-[[Swing - JButton inside JTable Cell>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=680674]]

**コメント [#t2516d67]
#comment