簡體   English   中英

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

[英]How do I refresh JTable with ActionListener in JFrame?

我想用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() ,但它們都沒有起作用。 我應該怎么做才能刷新我的桌子? 這也是一張圖片:

它不會刷新:

它不刷新

由於您尚未發布有效的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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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