java - 使用 cellEditor() 删除带有 jButton 的 jTable 行;

标签 java swing jtable jbutton

我想在列内添加 jButton,然后使用添加的 jButton 删除行我已经尝试了一些 stackoverflow 问题并有以下代码,但这并没有删除行。

public class NewJFrame extends javax.swing.JFrame {

    JButton jb = new JButton();

    public NewJFrame() {
        initComponents();

        jTable.getColumn(" ").setCellRenderer(new TableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                jb.setText("Delete");
                return jb;
            }
        });

        jTable.getColumn(" ").setCellEditor(new TableCellEditor() {
            @Override
            public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
                if (isSelected) {
                    jb.addActionListener(new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                             jTable = (JTable) e.getSource();
                        int modelRow = Integer.valueOf(e.getActionCommand());
                        ((DefaultTableModel) jTable.getModel()).removeRow(modelRow);
                        }
                    });
                }
                return jb;
            }

最佳答案

我们可以像下面的示例程序一样做到这一点。我们可以编写一个自定义渲染器+编辑器,它只返回一个 JButton 作为渲染器/编辑器组件。请注意,行索引存储在编辑器中的字段中。

import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.table.*;
import java.awt.Component;
import java.awt.event.*;
import java.util.EventObject;

public class ButtonInTable {

  public static void main(String[] args) {

    DefaultTableModel tableModel = new DefaultTableModel(
        new Object[][] {
            {"aa", "aaa", ""},
            {"bb", "bbb", ""},
            {"cc", "ccc", ""},
            {"dd", "ddd", ""},
            {"ee", "eee", ""}},
        new Object[] {"Column 1", "Column 2", " "});
    JTable table = new JTable(tableModel);
    table.getColumn(" ").setCellRenderer(new RendererAndEditor(table));
    table.getColumn(" ").setCellEditor(new RendererAndEditor(table));

    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(new JScrollPane(table));
    f.setBounds(300, 200, 400, 300);
    f.setVisible(true);
  }
}

class RendererAndEditor implements TableCellRenderer, TableCellEditor {

  private JButton button;
  private int row;

  RendererAndEditor(JTable table) {
    button = new JButton("Delete");
    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
        tableModel.removeRow(row);
      }
    });
  }

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

  @Override
  public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
                                                        int column) {
    this.row = row;
    return button;
  }

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

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

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

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

  @Override
  public void cancelCellEditing() { }

  @Override
  public void addCellEditorListener(CellEditorListener l) { }

  @Override
  public void removeCellEditorListener(CellEditorListener l) { }
}

关于java - 使用 cellEditor() 删除带有 jButton 的 jTable 行;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54259863/

相关文章:

java - 如何忽略 Eclipse 中特定类型的未捕获异常?

java - 二叉树:节点数与子树高度之间的除法最大值

java - 如何捕获 javas-swing 应用程序中文本区域中的 jar 文件发出的控制台输出

java - 需要帮助添加使用 system.exit(0) 的 JButton

java - JTable 错误 : java. lang.ArrayIndexOutOfBoundsException: 1 >= 0

java.lang.NoClassDefFoundError : Failed resolution of: Lcom/google/android/gms/common/util/zzq;

javascript - 如何强制 Apache Tapestry 更新 javascript?

java - 在 Java Swings 中自定义 JTextField - 向 JTextField 添加简单/复合/自定义边框

java - 单个 JTable 单元格中的多个对象

java - 如何将排序的 Map 转换为 JTable 的二维数组