代码改变世界

JFrame 刷新问题

2012-05-11 13:32  youxin  阅读(6663)  评论(0编辑  收藏  举报

先看下面的一段代码:

import java.awt.Container;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Icon extends JFrame {
    private ImageIcon icon;
    private JLabel label1;
    private JPanel panel;
    public Icon()
    {
        Container container=getContentPane();
        setSize(1000,1000);
        setVisible(true);
        icon=createImageIcon("image/yanzi.png","燕姿");
        //label1=new JLabel( "icon display",icon,JLabel.CENTER);
        label1=new JLabel(icon);
        label1.setBounds(0, 0,300,500);
        this.add(label1);
        
        setLayout(null);
        setTitle("icon");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
    }
    protected  ImageIcon createImageIcon(String path, String description) {
        // TODO Auto-generated method stub
        URL imgURL=getClass().getResource(path);
    
        
        if(imgURL!=null)
            return new ImageIcon(imgURL,description);
        else
            System.out.println("couldn't find file "+path);
        return null;
    }
    public static void main(String[] args)
    {
        Icon icon=new Icon();
    }    
    
}
运行后显示的是一个空白的JFrame,只有当改变jframe大小时,图片才显示,因为构造函数里setVisible(true)是出现在添加组件的前面,jframe显示时是没有label的,改变大小时就会刷新jframe显示图片。可以改成如下:
  先添加组件在显示。setVisible(true);放在添加组件后。
或者在添加组件后立即重绘,repaint();
还可以 重新布局

setVisible(true);
添加组件
invalidate();

   validate();

Class Container 方法

validate 
public   void   validate() 验证此容器及其所有子组件。   
使用   validate   方法会使容器再次布置其子组件。已经布置容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。 




当画出JFrame的以后,有时候需要响应某些监听事件,向JFrame里添加组件。这时候如果不做任何处理的话,JFrame是不会刷新的(除非窗口最小化,大小改变),所以需要我们强制刷新,用的方法是updateUI(),下面是一个实验程序,响应单选框选中,加入一个JButton,注意这里我使用的是JFrame,如果换成Frame的话,则无效果
public class Text extends JFrame{
JCheckBox a = new JCheckBox("1");
JFrame f = new JFrame("text");
JPanel p= new JPanel(new GridLayout(4,1));

public void lantchFrame(){
   f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
     System.exit(0);
    }
   });
   p.add(a);
   f.add(p);
   a.addActionListener(new MyListener());
   f.pack();
   f.setSize(320,240);
   f.setVisible(true);
}
class MyListener implements ActionListener {
   public void actionPerformed(ActionEvent e) {
    if(a.isSelected()){
     JButton jb3 = new JButton("jb3");
     p.add(jb3);
    p.updateUI();
    }
   }
}
public static void main(String [] args){
   new Text().lantchFrame();
}
}
JPanel updateUI() 
          Resets the UI property with a value from the current look and feel.