Java 验证或重新绘制此案例?
嗨,点击刷新按钮后,我很难重新绘制JPanel,在我的真实应用程序中,我有代表模型文件列表的JLabel,每次点击刷新按钮时,JPanel中显示的JLabel列表都必须相应更新,我很难做到这一点,所以这里我做了一个简单的清理和可编译的例子,我希望在点击刷新按钮后,JPanel被清理(只是为了让事情变得简单)。因此,我确保在EDT中调用更新,我在chnaged Jpanel(panConf)上手动执行了invalidate,并调用了最高comp的重新验证,即JFrame。没有任何效果,所以我添加了重绘,但也没有效果。你能帮我吗Java 验证或重新绘制此案例?,java,swing,jpanel,Java,Swing,Jpanel,嗨,点击刷新按钮后,我很难重新绘制JPanel,在我的真实应用程序中,我有代表模型文件列表的JLabel,每次点击刷新按钮时,JPanel中显示的JLabel列表都必须相应更新,我很难做到这一点,所以这里我做了一个简单的清理和可编译的例子,我希望在点击刷新按钮后,JPanel被清理(只是为了让事情变得简单)。因此,我确保在EDT中调用更新,我在chnaged Jpanel(panConf)上手动执行了invalidate,并调用了最高comp的重新验证,即JFrame。没有任何效果,所以我添加了
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class PanRepaint extends JFrame {
private JPanel pan1;
private JPanel mainPanel;
private JPanel panConf;
private JFrame dis;
public PanRepaint() {
JLabel label1 = new JLabel("ZAZAZA");
JLabel label2 = new JLabel("Label 2");
JButton btn = new JButton("Update");
dis = this;
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
panConf = new JPanel();
panConf.invalidate();
//dis.invalidate();
dis.validate();
dis.repaint();
}
});
}
});
panConf = new JPanel();
pan1 = new JPanel();
mainPanel = new JPanel();
panConf.add(label1);
panConf.add(label2);
pan1.add(btn);
mainPanel.add(panConf);
mainPanel.add(pan1);
setContentPane(mainPanel);
this.setSize(400, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
PanRepaint pr = new PanRepaint();
}
}
您在ActionListener的actionPerformed方法中创建了一个新的JPanel,但将其添加为nothing,特别是将其添加到容器层次结构指向顶级窗口(这里是JFrame)的no容器中,因此对它的更改不会反映在GUI中 我怀疑您有这样一种谬误:如果您有一个变量引用一个新对象并更改新对象的状态,这里是panConf,那么您将以某种方式更改该变量先前引用的原始对象的状态,但Java不是这样工作的。panConf在程序开始时引用的原始JPanel仍然存在,并且仍然在GUI中保持不变。关键是您必须理解引用变量和对象(或引用)之间的区别。这是一个关键的Java概念,可能需要一些努力才能完全实现,但值得努力 取而代之的是,只需移除原始panConf JPanel所持有的组件:
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// do not create a new JPanel here
panConf.removeAll();
panConf.revalidate();
panConf.repaint();
}
});
或者更好地使用交换视图
此外,不需要在EDT上使用
SwingUtilities.invokeLater
和可运行队列。代码已经在事件线程上被调用。您在ActionListener的actionPerformed方法中创建了一个新的JPanel,但将其添加为nothing,特别是将其添加到容器层次结构导致顶级窗口(这里是JFrame)的no容器中,因此对它的更改不会反映在GUI中
我怀疑您有这样一种谬误:如果您有一个变量引用一个新对象并更改新对象的状态,这里是panConf,那么您将以某种方式更改该变量先前引用的原始对象的状态,但Java不是这样工作的。panConf在程序开始时引用的原始JPanel仍然存在,并且仍然在GUI中保持不变。关键是您必须理解引用变量和对象(或引用)之间的区别。这是一个关键的Java概念,可能需要一些努力才能完全实现,但值得努力
取而代之的是,只需移除原始panConf JPanel所持有的组件:
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// do not create a new JPanel here
panConf.removeAll();
panConf.revalidate();
panConf.repaint();
}
});
或者更好地使用交换视图
此外,不需要在EDT上使用
SwingUtilities.invokeLater
和可运行队列。代码已经在事件线程上被调用。您在ActionListener的actionPerformed方法中创建了一个新的JPanel,但将其添加为nothing,特别是将其添加到容器层次结构导致顶级窗口(这里是JFrame)的no容器中,因此对它的更改不会反映在GUI中
我怀疑您有这样一种谬误:如果您有一个变量引用一个新对象并更改新对象的状态,这里是panConf,那么您将以某种方式更改该变量先前引用的原始对象的状态,但Java不是这样工作的。panConf在程序开始时引用的原始JPanel仍然存在,并且仍然在GUI中保持不变。关键是您必须理解引用变量和对象(或引用)之间的区别。这是一个关键的Java概念,可能需要一些努力才能完全实现,但值得努力
取而代之的是,只需移除原始panConf JPanel所持有的组件:
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// do not create a new JPanel here
panConf.removeAll();
panConf.revalidate();
panConf.repaint();
}
});
或者更好地使用交换视图
此外,不需要在EDT上使用
SwingUtilities.invokeLater
和可运行队列。代码已经在事件线程上被调用。您在ActionListener的actionPerformed方法中创建了一个新的JPanel,但将其添加为nothing,特别是将其添加到容器层次结构导致顶级窗口(这里是JFrame)的no容器中,因此对它的更改不会反映在GUI中
我怀疑您有这样一种谬误:如果您有一个变量引用一个新对象并更改新对象的状态,这里是panConf,那么您将以某种方式更改该变量先前引用的原始对象的状态,但Java不是这样工作的。panConf在程序开始时引用的原始JPanel仍然存在,并且仍然在GUI中保持不变。关键是您必须理解引用变量和对象(或引用)之间的区别。这是一个关键的Java概念,可能需要一些努力才能完全实现,但值得努力
取而代之的是,只需移除原始panConf JPanel所持有的组件:
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// do not create a new JPanel here
panConf.removeAll();
panConf.revalidate();
panConf.repaint();
}
});
或者更好地使用交换视图
此外,不需要在EDT上使用
SwingUtilities.invokeLater
和可运行队列。该代码已在事件线程上被调用。我根本不明白您在这里试图完成什么。游戏结束后是什么?我想在按下按钮后显示一个空帧。我根本不明白您在这里试图完成什么。游戏结束后是什么?我想在按下按钮后显示一个空帧。我不知道我完全明白你想在这里实现什么。游戏的结局是什么?我想在按下按钮后显示一个空框。我不明白你想实现什么