gpt4 book ai didi

java - 使用 ActionListener 刷新 JFrame

转载 作者:行者123 更新时间:2023-12-02 04:29:36 26 4
gpt4 key购买 nike

这个问题已经被问过很多次了,但我真的无法解决这个问题。我在添加一行后尝试在 JFRame 运行时刷新表,这样我就不必重新启动它。我已经尝试了以下方法,但它仍然不起作用。该方法在 ActionListener 中使用。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JButton;

@SuppressWarnings("serial")
public class GUI2 extends JFrame {

private static JPanel contentPane;
private static JTable table;

/**
* Launch the application.
*/
public static void main(String[] args) {
GUI2 frame = new GUI2();

}

/**
* Create the frame.
*/
public GUI2() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
setContentPane(contentPane);

table = new JTable();
contentPane.add(table, BorderLayout.CENTER);

JButton btnRefresh = new JButton("Refresh");
contentPane.add(btnRefresh, BorderLayout.NORTH);
btnRefresh.addActionListener(new Refresh());
}
public class Refresh implements ActionListener{
public void actionPerformed(ActionEvent e){
repaintGUI();
}
}
public static void repaintGUI() {

contentPane.repaint();
contentPane.validate();
table.repaint();
table.validate();
}
}

类似的东西。在我更改表中的某些内容后按下按钮。

最佳答案

您发布的代码作为示例效果不佳,因为 JTable 未可视化,但如果您为 contentPane 提供 BorderLayout,JTable 将显示,并且如果刷新被推送,则 GUI 实际上会重新绘制,但作为正如预期的那样,它不会改变其外观,因为如果不执行其他操作,简单的重新绘制或重新验证不会改变外观。

好吧,这就是我需要猜测的地方,因为你的问题仍然缺乏关键细节(以后请站在我们的角度来提问:那些不知道你当前程序的用途、外观或功能的人)你的问题是什么),但如果问题是你试图重置 JTable 的数据,那么解决方案就是这样做 - 通过调用 setRowCount(0) 重置你的 JTable 模型如果使用 DefaultTableModel,将从 JTable 中删除所有数据。如果它不使用 DefaultTableModel,请确保为 JTable 提供一个新的表模型,或者调用您自己的表模型的方法来删除所有数据。

例如:

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.DefaultTableModel;

public class GUI3 extends JPanel {
private static final String[] COLS = { "Foo", "Bar", "Baz" };
private static final int ROWS = 5;
private DefaultTableModel tableModel = new DefaultTableModel(COLS, ROWS);
private JTable table = new JTable(tableModel);
private ResetAction resetAction = new ResetAction("Reset", KeyEvent.VK_R);
private RandomizeAction randomizeAxn = new RandomizeAction("Randomize",
KeyEvent.VK_Z);

public GUI3() {
JPanel btnPanel = new JPanel();
btnPanel.add(new JButton(resetAction));
btnPanel.add(new JButton(randomizeAxn));

setLayout(new BorderLayout());
add(new JScrollPane(table));
add(btnPanel, BorderLayout.PAGE_END);
}

private class ResetAction extends AbstractAction {
public ResetAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}

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

private class RandomizeAction extends AbstractAction {
private Random random = new Random();

public RandomizeAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}

public void actionPerformed(ActionEvent e) {
tableModel.setRowCount(ROWS);
int rows = ROWS;
int columns = tableModel.getColumnCount();
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
int data = random.nextInt(10);
tableModel.setValueAt(data, row, col);
}
}
};
}

private static void createAndShowGui() {
GUI3 mainPanel = new GUI3();

JFrame frame = new JFrame("GUI3");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com