JPanel不会更新

时间:2019-08-03 17:52:33

标签: java swing jpanel

我在更新JPanel时遇到了问题。

我的简单程序使用一个自定义的JPanel,它显示一个标签和一个文本字段。主面板上的Jbutton用于将JPanel替换为新的JPanel。初始面板显示正常,但是当按下按钮时,面板不会使用新的MyPanel更新。我可以说随着计数的增加,正在创建一个新对象。

public class SwingTest extends JFrame{

    private JPanel mp;
    private JPanel vp;
    private JButton button;

    public static void main(String[] args) {
        SwingTest st = new SwingTest();
    }

    public SwingTest() {
        vp = new MyPanel();
        mp = new JPanel(new BorderLayout());
        mp.add(vp, BorderLayout.CENTER);
        button = new JButton("Change");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent ae) {
                vp = new MyPanel();
                vp.revalidate();
            }
        });

        mp.add(button, BorderLayout.SOUTH);
        this.add(mp);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(250, 150);
        pack();
        setVisible(true);
    }
}

和我的自定义面板。...

public class MyPanel extends JPanel{

    private JLabel label;
    private JTextField tf;

    static int count = 0;

    public MyPanel(){
        count++;
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        setPreferredSize(new Dimension(400, 200));

        c.gridx = 0;
        c.gridy = 0;

        label = new JLabel(String.valueOf(count));
        tf = new JTextField(10);

        add(label,c);
        c.gridx = 1;

        add(tf, c);
    }
}

1 个答案:

答案 0 :(得分:1)

您声明:

  

主面板上的Jbutton用于将JPanel替换为新的JPanel。

但此代码:

button.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent ae) {
        vp = new MyPanel();
        vp.revalidate();
    }
});

,但是此代码根本不执行此操作。它所做的只是通过vp变量更改JPanel 引用,但对GUI显示的JPanel绝对没有影响,这表明您在混淆 reference变量 reference 或对象。要更改显示的JPanel,必须执行以下操作:将新的JPanel添加到容器中,将JPanel添加到BorderLayout.CENTER(默认)位置,然后在容器上调用revalidate()repaint()

例如

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        // vp = new MyPanel();
        // vp.revalidate();
        mp.remove(vp);  // remove the original MyPanel from the GUI
        vp = new MyPanel();  // create a new one
        mp.add(vp, BorderLayout.CENTER); // add it to the container

        // ask the container to layout and display the new component 
        mp.revalidate();
        mp.repaint();
    }
});

或更妙的是-使用CardLayout交换视图。

或更妙的是,只需清除JTextField保留的值即可。

有关参考变量和对象之间区别的更多信息,请查看乔恩·斯凯特(Jon Skeet)对以下问题的回答:What is the difference between a variable, object, and reference?