web-dev-qa-db-ja.com

SwingのJTableの行にボタンを追加する方法java

私はいくつかの行と列を持つJTableを持つ1つのスイングGUIを作成しましたが、JTableの行にボタンを追加するにはどうすればよいですか?

26
om.

行に追加するのではなく、セルに追加します。 このチュートリアル 必要なものを説明しています。

34
Bostone

コンポーネントを表のセルとして追加できます。

まず、JButtonを親クラスとして持つクラスと、TableCellRendererとTableCellEditorの2つのインターフェイスを実装する必要があります。

TableCellEditorを実装する理由は、ボタンのActionEventを受け取るためです。

public class TableButton extends JButton implements TableCellRenderer, TableCellEditor {
  private int selectedRow;
  private int selectedColumn;
  Vector<TableButtonListener> listener;

  public TableButton(String text) {
    super(text); 
    listener = new Vector<TableButtonListener>();
    addActionListener(new ActionListener() { 
      public void actionPerformed( ActionEvent e ) { 
        for(TableButtonListener l : listener) { 
          l.tableButtonClicked(selectedRow, selectedColumn);
        }
      }
    });
  }

  public void addTableButtonListener( TableButtonListener l ) {
    listener.add(l);
  }

  public void removeTableButtonListener( TableButtonListener l ) { 
    listener.remove(l);
  }

  @Override 
  public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row, int col) {
    return this;
  }

  @Override
  public Component getTableCellEditorComponent(JTable table,
      Object value, boolean isSelected, int row, int col) {
    selectedRow = row;
    selectedColumn = col;
    return this;
  } 

  @Override
  public void addCellEditorListener(CellEditorListener arg0) {      
  } 

  @Override
  public void cancelCellEditing() {
  } 

  @Override
  public Object getCellEditorValue() {
    return "";
  }

  @Override
  public boolean isCellEditable(EventObject arg0) {
    return true;
  }

  @Override
  public void removeCellEditorListener(CellEditorListener arg0) {
  }

  @Override
  public boolean shouldSelectCell(EventObject arg0) {
    return true;
  }

  @Override
  public boolean stopCellEditing() {
    return true;
  }
}

次に、ボタンイベントを次のように処理するために、TableButtonListenerという名前のEventListenerを追加しました。

public interface TableButtonListener extends EventListener {
  public void tableButtonClicked( int row, int col );
}

そして、上記のレンダラー/エディターを使用します。

TableButton buttonEditor = new TableButton("Button");
buttonEditor.addButtonListener(new TableButtonListener() {
  @Override
  public void tableButtonClicked(int row, int col) {
    // do something 
  }     
}); 

TableColumn col = new TableColumn(1, 80);
col.setCellRenderer(buttonEditor);
col.setCellEditor(buttonEditor);

cols.addColumn(colPattern);

行ごとに異なるボタンのラベルを表示する場合は、ボタンのラベルを変更するgetTableCellRendererComponentおよびgetTableCellEditorComponentにコードブロックを挿入する必要があります。

編集:コードはすぐにコンパイルされます。TableButtonコンストラクターのブラケットエラーが修正されました。

20
xrath

テーブルボタン列 1つのアプローチを示します。

8
camickr