[英]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.