簡體   English   中英

JTable使用AbstractTableModel刪除多行

[英]JTable delete multiple rows with AbstractTableModel

我無法正常執行刪除功能。 我有一個帶有customTableModel的JTable,它擴展了AbstractTableModel。 當我只刪除1行時,它可以正常工作,但是一旦我嘗試一次刪除多行,它的一部分就會被刪除。

我的代碼如下:

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.)模型

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:

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

}

有人知道我在做什么錯嗎?

提前致謝!

在這個部分:

@Override
public void actionPerformed(ActionEvent e) {
    for (int i = 0; i < data.size(); i++) {
        if (data.get(i).isSelected()) {
            ((MyTableTestModel) table.getModel()).removeRow(i);
        }
    }
}

從頭開始,迭代到刪除的開始,因為刪除時,它是從data刪除元素,並且在迭代到下一個元素時(通過i++ ),您正在跳過一些行。 用。。。來代替:

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM