私はいくつかの行と列を持つJTableを持つ1つのスイングGUIを作成しましたが、JTableの行にボタンを追加するにはどうすればよいですか?
行に追加するのではなく、セルに追加します。 このチュートリアル 必要なものを説明しています。
コンポーネントを表のセルとして追加できます。
まず、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コンストラクターのブラケットエラーが修正されました。
テーブルボタン列 1つのアプローチを示します。