如何在Swing java中添加一行JTable中的按钮

om.*_*om. 26 java swing jtable

我已经创建了一个带有JTable的swing GUI,其中有一些行和Columns.我应该如何在JTable中添加一个按钮?

Bos*_*one 34

您不将它添加到一行 - 您将其添加到单元格.本教程描述了您的需求.

  • 瓦乌!我刚打开那个例子,意识到源代码在CellEditor中添加了一个"new JCheckbox".但实际上它呈现为JButton.无论如何,我的问题是,我们为什么要把JCheckBox放进去呢?:( (2认同)
  • @Bostone - 如何将不同单元格中的数据作为参数发送到按钮触发的函数?---该示例仅显示正在使用的单元格自己的数据,因此我有点丢失. (2认同)

小智 20

您可以将Component添加为表格单元格.

首先,您应该实现一个具有JButton作为父类的类和两个具有TableCellRenderer和TableCellEditor的接口.

应该实现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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,我添加了一个名为TableButtonListener的EventListener来处理按钮事件,如下所示.

public interface TableButtonListener extends EventListener {
  public void tableButtonClicked( int row, int col );
}
Run Code Online (Sandbox Code Playgroud)

并使用上面的渲染器/编辑器.

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);
Run Code Online (Sandbox Code Playgroud)

如果要为每一行显示不同的按钮标签,则应将代码块插入到getTableCellRendererComponent和getTableCellEditorComponent中,即修改按钮的标签.

编辑:代码现在编译.TableButton构造函数中的包围错误已修复.

  • -1这是CellEditor的非法实现:通过合同,它_must_通知已注册的CellEditorListeners.对于addEditorListener的空实现而言,这很简单;-)超级契约_must_由实现服务,没有办法. (3认同)

cam*_*ckr 8

表按钮列提供了一种方法.