下面是我写一个测试程序,
把画图的语句放在paint方法中,定时调用repaint来实现界面刷新。以前写JFrame的时候可行。现在换成JWindow以后就不行了。不会调用paint方法了。我百度过JWindow是会调用paint方法,什么地方出问题了呢。求解。在线等回复
class Welcome extends JWindow {

boolean isFinish = false;//是否加载结束
Toolkit tk =Toolkit.getDefaultToolkit();
Image image = tk.getImage(Welcome.class.getClassLoader().getResource("loading.jpg"));
public Welcome(){
super();
new Thread(new PaintThread()).start();
}
@Override
public void paint(Graphics g){
JLabel label = new JLabel(new ImageIcon("loading.jpg"));
Dimension screenSize =tk.getScreenSize();
Dimension labelSize = label.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2),screenSize.height/2 - (labelSize.height/2));
this.add(label);
                setVisible(true);
}

private class PaintThread implements Runnable{//线程重画
public void run() {
while(true){
repaint();
try {
Thread.sleep(25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

public static void main(String[] args) {
new Welcome();
}
}

解决方案 »

  1.   

    Swing中paint调用的两种途径:
     
    A.由第一个重量级的祖先(ancestor)调用paint请求(通常是JFrame, JDialog, JWindow, JApplet)
    B.由javax.swing.JComponent的扩展的repaint方法产生的paint请求求解。
      

  2.   

    LZ要注意这么几点
    1 不需要自己开线程paint,因为paint方法会被SWing系统反复调用,维护图片显示正常
    2 在paint方法中要调用super.paint(g),以免破坏窗体绘画
    3 因为paint会被反复调用,所以new Label和add之类的动作,不能在paint里面做
      

  3.   

    应该在pain中加上super.paint(g),就差不多了吧
      

  4.   

    我自己写的paint方法没有调用,他调用系统本身的,为什么
      

  5.   

    import javax.swing.*;
    import java.awt.*;class Welcome extends JWindow {    boolean isFinish = false;//是否加载结束
        Toolkit tk =Toolkit.getDefaultToolkit();
        Image image = tk.getImage(Welcome.class.getClassLoader().getResource("loading.jpg"));
        public Welcome(){
            super();
            JLabel label = new JLabel(new ImageIcon("loading.jpg"));
            Dimension screenSize =tk.getScreenSize();
            Dimension labelSize = label.getPreferredSize();        this.add(label);
            pack();
            setLocation(screenSize.width/2 - (labelSize.width/2),screenSize.height/2 - (labelSize.height/2));
            setVisible(true);        new Thread(new PaintThread()).start();
        }    private class PaintThread implements Runnable{//线程重画
            public void run() {
                while(true){
                    repaint();
                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }    public static void main(String[] args) {
            new Welcome();
        }
    }
      

  6.   

    我当时的初衷是要程序强制重画,因为swing重画只有在窗体发生变化时才进行。实现类似eclipse的欢迎界面的效果。实时显示系统的加载情况。
      

  7.   

    呃,这样做线程重画的代码没有起作用。Thread的代码去掉也不没关系。