java - 如何在 JFrame 中使用 ActionListener 刷新 JTable?

标签 java swing jtable actionlistener jmenuitem

我想使用 ActionListener 刷新我的 JFrame 中的二维数组表。这是我的程序中的一些代码:

public Students(){
     .....
     removeall = new JMenuItem("Remove All Students");
     removeall.addActionListener(this);
     .....
}
public void actionPerformed(ActionEvent e) {

    if(e.getSource().equals(removeall)) {
        removeAll();
        table.repaint();
}

public void removeAll() {

    for(int i=name1.size()-1;i>=0;i--) 
    {
        lastname1.remove(i);
        id1.remove(i);
        quiz11.remove(i);
        quiz21.remove(i);
        midterm1.remove(i);
        project1.remove(i);
        final1.remove(i);
        lettergrade1.remove(i);
        average1.remove(i);
        name1.remove(i);
        tablemodel.removeRow(i);
    }
    JOptionPane.showMessageDialog(this,"All students are removed. ");
}

如您所见,我尝试了 repaint()tableModel.fireTableDataChanged() 但它们都不起作用。我应该怎么做才能刷新我的表?这里还有一张图片:

它不刷新:

It doesn't refresh

最佳答案

您的问题无法准确回答,因为您尚未发布有效的 MCVE供我们编译和运行,但看起来您正在尝试更改用于初始化 JTable 模型的集合的状态,而不更改实际模型本身。

话虽如此,要从 JTable 中删除所有数据,请删除所有行。如果您使用的是 DefaultTableModel,则这意味着只需在模型上调用 .setRowCount(0) 即可。

请注意,在这种情况下无需调用 repaint(),因为通过更改模型,会自动调用 repaint。此外,您的代码甚至不应该尝试在模型上调用 fireTableDataChanged(),因为这种类型的调用只能由模型本身在内部调用。

例如,我的 MCVE:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.*;

public class TableExample {
    private static void createAndShowGui() {
        TablePanel tablePanel = new TablePanel();
        JMenuItem fillTableItem = new JMenuItem(new FillTableAction(tablePanel));
        JMenuItem clearTableItem = new JMenuItem(new ClearTableAction(tablePanel));

        JMenu tableMenu = new JMenu("Table Actions");
        tableMenu.setMnemonic(KeyEvent.VK_T);
        tableMenu.add(fillTableItem);
        tableMenu.add(clearTableItem);
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(tableMenu);

        JFrame frame = new JFrame("TableExample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(tablePanel);
        frame.setJMenuBar(menuBar);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

@SuppressWarnings("serial")
class FillTableAction extends AbstractAction {
    private TablePanel tablePanel;

    public FillTableAction(TablePanel tablePanel) {
        super("Fill Table");
        putValue(MNEMONIC_KEY, KeyEvent.VK_F);
        this.tablePanel = tablePanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        tablePanel.fillTable();
    }
}

@SuppressWarnings("serial")
class ClearTableAction extends AbstractAction {
    private TablePanel tablePanel;

    public ClearTableAction(TablePanel tablePanel) {
        super("Clear Table");
        putValue(MNEMONIC_KEY, KeyEvent.VK_C);
        this.tablePanel = tablePanel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        tablePanel.clearTable();
    }
}

@SuppressWarnings("serial")
class TablePanel extends JPanel {
    private static final String[] COL_NAMES = { "Name", "Surname", "ID" };
    private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
    private JTable table = new JTable(model);
    private Random random = new Random();

    public TablePanel() {
        setLayout(new BorderLayout());
        add(new JScrollPane(table));
    }

    public void clearTable() {
        model.setRowCount(0);
    }

    // fill it with random text and data
    public void fillTable() {
        int rows = random.nextInt(50) + 40;
        for (int i = 0; i < rows; i++) {
            StringBuilder sb = new StringBuilder();
            char c = (char) ('A' + random.nextInt(26));
            sb.append(c);
            for (int j = 0; j < 4 + random.nextInt(3); j++) {
                sb.append((char) ('a' + random.nextInt(26)));
            }
            String name = sb.toString();

            sb.delete(0, sb.length());
            sb.append((char) ('A' + random.nextInt(26)));
            for (int j = 0; j < 6 + random.nextInt(4); j++) {
                sb.append((char) ('a' + random.nextInt(26)));
            }
            String surName = sb.toString();

            int id = random.nextInt(Integer.MAX_VALUE / 2);

            Object[] rowData = { name, surName, id };
            model.addRow(rowData);
        }
    }
}

关于java - 如何在 JFrame 中使用 ActionListener 刷新 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47242232/

相关文章:

java - SQLite 查询在 Android 上真的很慢

java - 将 RestTemplate 交换转换为 okHttpClient 调用

java8 一个 map 列表,按键减少

java - 为 jtable 单元格设置事件

java - 最小化主面板后 JTable 单元格颜色发生变化

java - 对于 OOP,是否应该尽可能频繁地将方法转换为对象?

java - 如何捕获一组循环生成的 JToggleButton 的点击量?

java - 带有复选框和 JFileChooser 的 Swing JTree

java - JDialog关闭按钮事件

java - 从数据库表中将值添加到 JTable 中