下面是我写一个测试程序,
把画图的语句放在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();
}
}
把画图的语句放在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();
}
}
A.由第一个重量级的祖先(ancestor)调用paint请求(通常是JFrame, JDialog, JWindow, JApplet)
B.由javax.swing.JComponent的扩展的repaint方法产生的paint请求求解。
1 不需要自己开线程paint,因为paint方法会被SWing系统反复调用,维护图片显示正常
2 在paint方法中要调用super.paint(g),以免破坏窗体绘画
3 因为paint会被反复调用,所以new Label和add之类的动作,不能在paint里面做
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();
}
}