/** 我搜了搜以前关于刷新的帖子,发现好像是用validate()来刷新的,但我用它实现不了刷新,下面的程序是JFrame,它的pane中有一个label为"1"的button, 现在有一个方法改变其所在的button, 方法里加上了validate()好刷新JFrame,但我调用了方法后运行发现还是初始化时的button(label为"1"),请问为什么啊?我哪里写错了?应该怎么改正?谢谢!!!!~~~ */import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Test extends JFrame{
JButton button;
Test(){
button = new JButton("1");
getContentPane().add(button);
} public void setButton(JButton button){
this.button = button;
validate();
} public static void main(String[] args){
Test ts = new Test();
ts.setButton(new JButton("2"));
ts.setVisible(true);
}
}

解决方案 »

  1.   

    this.button是一个button对象的引用,它虽然存在于你的JFrame的扩展类里,并不等于安置在JFrame的窗体上。
    当使用JFrame的add()方法把一个部件安置到JFrame上时,JFrame在自己的内部,也会保存一个该对象的引用。
    你的代码换了this.button所引用的button对象,而JFrame仍然持有原button对象的引用,不会随着this.button的改变而改变。如果你只想更改label,可以使用this.button.setLabel("2");这是,使用validate()就可以改变显示。
    如果你确实想另换一个button对象,就应该这样做:
    public void setButton(JButton button){
    remove(this.button);
    this.button = button;
    add(this.button);
    validate();
    }