import java.awt.*;
import javax.swing.*;public class Test implements Runnable{
private static BoardPanel boardPanel = new BoardPanel(); 
Test(){
new Thread(this).start();
}
@Override
public void run(){
int i = 1;
while(true){
try{
Thread.sleep(30);
}
catch(InterruptedException e){
}
boardPanel.repaint();
System.out.println("Thread run "+(i++));
}
}
public static void main(String[] args){
new Test();
BoardPanel boardPanel = new BoardPanel(); 
JFrame frame = new JFrame();
frame.add(boardPanel,BorderLayout.CENTER);
frame.setSize(475,494);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class BoardPanel extends JPanel{
@Override
public void update(Graphics g){
paint(g);
}
int i = 1;
@Override
public void paint(Graphics g){
System.out.println("paint "+(i++));
}
}

解决方案 »

  1.   

    不明白为什么repaint只调用paint一次,大家看看效果就明白我的意思了。
      

  2.   

    将main方法里的BoardPanel boardPanel = new BoardPanel();  引用改下就可以了正常调用repaint了
    我的机子快 在执行到这句改变引用指向前boardpanel作为一个静态对象调用了repaint两次 但一旦主线程到这句改变boardpanel指向 boardpanel便不再是Test类里的静态成员变量了 它调用的repaint()方法就不再是你所想看的的那个System.out.println("paint "+(i++));了
      

  3.   

    上边的解释有问题 应该是改变指向后boardPanel作为主线程的资源一直被占用了 所以另一个线程中才无法调用 大概应该是这个样子