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

27

我做了一个带有行和列的JTable的Swing GUI界面。如何向JTable中的某一行添加按钮?

3个回答

37

你不需要将它添加到行,而是需要将其添加到单元格中。这篇教程描述了你所需的内容。


2
哇!我刚打开那个例子,发现源代码在CellEditor中添加了一个“new JCheckbox”。 但实际上它渲染为JButton。无论如何,我的问题是,为什么我们要把JCheckBox放进去呢?:( - gumuruh
2
@Bostone - 我该如何将不同单元格中的数据作为参数发送到由按钮触发的函数中?--- 示例仅显示使用单元格自身的数据,所以我有点迷失。 - CosmicGiant
1
这似乎无法为我显示按钮点击动画。 - Thomas Ahle
@ThomasAhle 我也遇到了同样的问题。你有什么解决方案吗? - Hritik R

21

你可以将组件添加为表格单元格。

首先,你应该实现一个类,它的父类是JButton,同时实现了两个接口:TableCellRendererTableCellEditor

实现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;
      }
    }

我添加了一个名为TableButtonListenerEventListener 来处理按钮事件,代码如下。


Then I added an EventListener named TableButtonListener` for handling button event as follows.
    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);

如果你想为每一行显示不同的按钮标签,你应该在 getTableCellRendererComponentgetTableCellEditorComponent 方法中插入一个代码块来修改按钮的标签。


4
这是对CellEditor的非法实现:按照合约,它必须通知已注册的CellEditorListeners。然而,由于没有实现addEditorListener,它无法轻易地执行此操作。超级合约必须由实现服务,无法绕过。 - kleopatra
1
如果在同一张表格中有多个按钮(如果将其设置为列的渲染器,则会出现此情况),则会出现渲染问题,因为所有按钮都是相同的实例。它会出现奇怪的问题,例如无法绘制按钮的一部分,只绘制白色背景或绘制多个按钮被突出显示而不仅仅是一个。我通过将其分离为两个单独的类TableButton和TableButtonEditor来解决了这个问题。我基于行和列索引在哈希映射中跟踪多个按钮。 - Ted
只想说我爱你。工作完美! - HNL

0

请查看表格按钮列

它演示了如何使用JButton作为自定义渲染器和编辑器,您可以轻松地单击并调用Action


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接