Java 验证或重新绘制此案例?

Java 验证或重新绘制此案例?,java,swing,jpanel,Java,Swing,Jpanel,嗨,点击刷新按钮后,我很难重新绘制JPanel,在我的真实应用程序中,我有代表模型文件列表的JLabel,每次点击刷新按钮时,JPanel中显示的JLabel列表都必须相应更新,我很难做到这一点,所以这里我做了一个简单的清理和可编译的例子,我希望在点击刷新按钮后,JPanel被清理(只是为了让事情变得简单)。因此,我确保在EDT中调用更新,我在chnaged Jpanel(panConf)上手动执行了invalidate,并调用了最高comp的重新验证,即JFrame。没有任何效果,所以我添加了

嗨,点击刷新按钮后,我很难重新绘制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
和可运行队列。该代码已在事件线程上被调用。

我根本不明白您在这里试图完成什么。游戏结束后是什么?我想在按下按钮后显示一个空帧。我根本不明白您在这里试图完成什么。游戏结束后是什么?我想在按下按钮后显示一个空帧。我不知道我完全明白你想在这里实现什么。游戏的结局是什么?我想在按下按钮后显示一个空框。我不明白你想实现什么