在我的 JTable 中,我所有的复选框都在第 3 列中。在我点击一个按钮后,它将 删除那些选中的行。
但是在我的 onclick 中实现这些功能之后。它不会删除行。
按钮监听器的方法
class DeleteBtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent arg0) {
for(int row = 0; row < table.getRowCount(); ++row) {
if((Boolean) table.getValueAt(row, 3) == true) {
myTableModel.removeRow(row);
table.revalidate();
table.repaint();
}
}
}
}
这就是我的 AbstractTableModel 类中的内容
@SuppressWarnings("serial")
class MyTableModel extends AbstractTableModel {
private final boolean DEBUG = true;
private String[] columnNames = {"Name",
"Age",
"Salary",
"Delete"};
private Object[][] data = {
{"Kathy", "20",new Integer(5), new Boolean(false)},
{"John", "35", new Integer(3), new Boolean(false)},
{"Sue", "20", new Integer(2), new Boolean(false)},
{"Jane", "12", new Integer(20), new Boolean(false)},
{"Mary", "42", new Integer(10), new Boolean(false)}
};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
@SuppressWarnings("unchecked")
public Class<?> getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
return true;
}
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value);
}
data[row][col] = value;
fireTableCellUpdated(row, col);
}
public void removeRow(int row) {
fireTableRowsDeleted(row, row);
}
}
最佳答案
您需要从模型中的实际数据(即数组数据)中删除该行。 fireTableRowsDeleted
是不够的。那只是更新 ui 的东西。但请记住,您使用的是数组。因此,您需要根据数据相应地推进行索引。最好使用 List 以便于操作。另请记住,您正试图在循环中“同时”删除行。因此,如果您删除一行,则还需要在循环中递减该行。
另外正如@AndrewThompson 提到的,只需使用 DefaultTableModel
.我没有看到您的模型有什么特别之处需要定制模型。
这是一个 DefaultTableModel
的例子
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class TestTable {
private DefaultTableModel myTableModel = getModel();
private JTable table = new JTable(myTableModel);
public TestTable() {
JButton button = new JButton("Remove All");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
for(int row = 0; row < table.getRowCount(); ++row) {
if((Boolean) table.getValueAt(row, 3) == true) {
System.out.println("true");
myTableModel.removeRow(row);
row--;
}
}
}
});
JFrame frame = new JFrame();
frame.add(new JScrollPane(table));
frame.add(button, BorderLayout.PAGE_END);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private DefaultTableModel getModel() {
String[] columnNames = {"Name",
"Age",
"Salary",
"Delete"};
Object[][] data = {
{"Kathy", "20",new Integer(5), new Boolean(false)},
{"John", "35", new Integer(3), new Boolean(false)},
{"Sue", "20", new Integer(2), new Boolean(false)},
{"Jane", "12", new Integer(20), new Boolean(false)},
{"Mary", "42", new Integer(10), new Boolean(false)}
};
return new DefaultTableModel(data, columnNames) {
@Override
public Class<?> getColumnClass(int col) {
switch(col) {
case 0:
case 1: return String.class;
case 2: return Integer.class;
case 3: return Boolean.class;
default: return Object.class;
}
}
};
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new TestTable();
}
});
}
}
关于java - 未从 JTable 中删除的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25338260/