我在更新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);
}
}
答案 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?