TITLE:JTableのセルにJButtonを追加して行削除

JTableのセルにJButtonを追加して行削除

編集者:Terai Atsuhiro
作成日:2007-10-22
更新日:2024-02-02 (金) 12:05:06

概要

JTableのセルにJButtonを追加し、クリックされたらその行を削除します。主にSwing - JButton inside JTable Cellの投稿を参考にしています。

#screenshot

サンプルコード

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;

解説

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

table.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent e) {
    int col = table.convertColumnIndexToModel(table.columnAtPoint(e.getPoint()));
    if(col==BUTTON_COLUMN) {
      int row = table.convertRowIndexToModel(table.rowAtPoint(e.getPoint()));
      model.removeRow(row);
    }
  }
});

複数選択を許可しない場合は、Swing - JButton inside JTable Cellのように、セルエディタにリスナーを追加し、選択されたセルを削除する方法もあります。

public ButtonColumn(final JTable table) {
  super();
  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);
    }
  });
  //...

複数選択を許可する場合は、Ctrlキーなどを押しながらのボタンクリックに注意する必要があります。

参考リンク

コメント