java - 删除 JTable 位的所有行,其占用空间仍然存在

标签 java swing jtable

我使用以下命令删除 JTable 的所有行:

myTableModel.getDataVector().removeAllElements();
myTableModel.setRowCount(0);

但是删除后它的足迹仍然存在!请检查此屏幕截图:
JTable after deletion

只有当我删除所有行时才会出现这种情况,即使只有一行也会出现 bo 问题!
为什么会出现这种情况?我该如何修复它?
谢谢

最佳答案

使用DefaultTableModel,您唯一的选择是使用模型提供的功能,removeRow

removeRow 将触发所需的适当事件,以告知 JTable 它需要自行更新。该表已经过优化,以改进绘画过程

enter image description here enter image description here

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                DefaultTableModel model = new DefaultTableModel();
                JTable table = new JTable(model);
                for (int index = 0; index < 10; index++) {
                    model.addColumn(index);
                }
                for (int row = 0; row < 1000; row++) {
                    String[] values = new String[10];
                    for (int col = 0; col < 10; col++) {
                        values[col] = row + "x" + col;
                    }
                    model.addRow(values);
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.add(new JButton(new DeleteRowsFromDefaultModel(model)), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class DeleteRowsFromDefaultModel extends AbstractAction {

        private final DefaultTableModel model;

        public DeleteRowsFromDefaultModel(DefaultTableModel model) {
            this.model = model;
            putValue(NAME, "Delete All");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            model.setRowCount(0);
        }

    }

}

如果您确实担心性能,则需要创建自己的模型并创建自己的 clear 方法来触发适当的事件。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;

public class TestTable1 {

    public static void main(String[] args) {
        new TestTable1();
    }

    public TestTable1() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                MyTabelModel model = new MyTabelModel();
                JTable table = new JTable(model);

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.add(new JButton(new DeleteRowsFromMyModel(model)), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class DeleteRowsFromMyModel extends AbstractAction {

        private final MyTabelModel model;

        public DeleteRowsFromMyModel(MyTabelModel model) {
            this.model = model;
            putValue(NAME, "Delete All");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            model.clear();
        }
    }

    public class MyTabelModel extends AbstractTableModel {

        private List<String[]> rows;

        public MyTabelModel() {
            rows = new ArrayList<>(1000);
            for (int row = 0; row < 1000; row++) {
                String[] values = new String[10];
                for (int col = 0; col < 10; col++) {
                    values[col] = row + "x" + col;
                }
                rows.add(values);
            }
        }

        @Override
        public int getRowCount() {
            return rows.size();
        }

        @Override
        public int getColumnCount() {
            return 10;
        }

        @Override
        public String getColumnName(int column) {
            return String.valueOf(column);
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            String[] row = rows.get(rowIndex);
            return row[columnIndex];
        }

        public void clear() {
            int old = getRowCount();
            if (old > 0) {
                rows.clear();
                fireTableRowsDeleted(0, old - 1);
            }
        }
    }
}

关于java - 删除 JTable 位的所有行,其占用空间仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16202862/

相关文章:

java - 如何获取剪贴板客户端内容并将其作为文件发送到服务器

java - 从字符串中删除特定单词

java - JFrame 中的开关面板

java - 为什么 JTable 中的 boolean 值显示为 true/false 而不是复选框?

java - 从 JTable 中添加和删除

java - 如何解码使用 jid3lib-0.5.4 获取的 ID3V2 标签

java - 如何学习Java Swing并快速制作GUI?

Java SwingWorker挂起

java - 在主类中处理按钮事件

java - 如何使用带有 Class 值的 JComboBox