[英]JTable delete multiple rows with AbstractTableModel
I cannot get my delete function work correctly. 我无法正常执行删除功能。 I have a JTable with a customTableModel, extending AbstractTableModel. 我有一个带有customTableModel的JTable,它扩展了AbstractTableModel。 When I delete just 1 row, it works alright, but as soon as I try to delete multiple rows at once just part of it gets deleted. 当我只删除1行时,它可以正常工作,但是一旦我尝试一次删除多行,它的一部分就会被删除。
My code is the following: 我的代码如下:
1.) GUI class with main method: 1.)GUI类的主要方法:
package jtabletest;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
@SuppressWarnings("serial")
public class TableDeletingTest extends JFrame {
private String[] columnNames = { "Selection", "ID" };
private ArrayList<TableTestData> data;
private JTable table;
private JScrollPane scp;
private JPanel pnlControls;
private JButton btnDelete;
public TableDeletingTest() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
createTestData(5);
constructTable();
createGUI();
setListeners();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void createGUI() {
scp = new JScrollPane(table);
pnlControls = new JPanel(new FlowLayout(FlowLayout.CENTER));
btnDelete = new JButton("delete");
add(scp, BorderLayout.CENTER);
add(pnlControls, BorderLayout.SOUTH);
pnlControls.add(btnDelete);
}
private void createTestData(int length) {
data = new ArrayList<TableTestData>();
for (int i = 0; i < length; i++) {
data.add(new TableTestData(i));
}
}
private void constructTable() {
MyTableTestModel model = new MyTableTestModel(data, columnNames);
table = new JTable(model);
}
private void setListeners() {
btnDelete.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < data.size(); i++) {
if (data.get(i).isSelected()) {
((MyTableTestModel) table.getModel()).removeRow(i);
}
}
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TableDeletingTest();
}
});
}
}
2.) Model 2.)模型
package jtabletest;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
@SuppressWarnings("serial")
public class MyTableTestModel extends AbstractTableModel {
private ArrayList<TableTestData> data;
private String[] columnNames;
public MyTableTestModel(ArrayList<TableTestData> data, String[] columnNames) {
this.data = data;
this.columnNames = columnNames;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return data.get(rowIndex).isSelected();
case 1:
return data.get(rowIndex).getId();
default:
return -1;
}
}
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return column == 0;
}
@Override
public void setValueAt(Object value, int row, int column) {
if (value instanceof Boolean && column == 0) {
data.get(row).setSelected((boolean) value);
fireTableCellUpdated(row, column);
}
}
public void removeRow(int row) {
data.remove(row);
fireTableRowsDeleted(row, row);
}
}
3.) TableData: 3.)TableData:
package jtabletest;
public class TableTestData {
private int id;
private boolean selected;
public TableTestData(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
}
Anyone knows what I'm doing wrong? 有人知道我在做什么错吗?
Thanks in advance! 提前致谢!
In this section: 在这个部分:
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < data.size(); i++) {
if (data.get(i).isSelected()) {
((MyTableTestModel) table.getModel()).removeRow(i);
}
}
}
Start from the end and iterate to the beginning to delete because when you delete, it is deleting elements from data
, and you are skipping some rows when you iterate to the next element (via i++
). 从头开始,迭代到删除的开始,因为删除时,它是从data
删除元素,并且在迭代到下一个元素时(通过i++
),您正在跳过一些行。 Replace with: 用。。。来代替:
@Override
public void actionPerformed(ActionEvent e) {
for (int i = data.size()-1; i >= 0; --i) {
if (data.get(i).isSelected()) {
((MyTableTestModel) table.getModel()).removeRow(i);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.