我想在列内添加 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/