在做一个类似俄罗斯方块的游戏,同颜色的方块消去,本来想用标记消去部分,显示另外颜色来突出消去的部分后再消去方块,但发现调用repaint()无效
下面是代码
这个actionListener 属于一个timerpublic void actionPerformed(ActionEvent e) {
     
if(!currentBar.canDown(matrix)){
     
while(true){
int newScore=matrix.checkMatrix();//方块颜色数据存储与matrix,checkMatrix将一个二维数组中能消去的部分标记成特殊的颜色,并返回获得的分数
score+=newScore; if(score>=MAX_SOCRE)   levelUp();
        
//!!!本来此时应显示按照已标记了消去部分的matrix 输出的图像,但实际未被调用!!
repaint(); try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
                                
                                matrix.adjustMatrix();//将标记部分消去,接着显示,表现出方块落下的效果
repaint();
if(newScore==0)
break;
  
}

if(matrix.isGameover())
  failedGame();


productNewBar();
matrix.setValue(currentBar);



}
 
 
else{
matrix.clearBar(currentBar);
currentBar.MOVEDOWN();
matrix.setValue(currentBar);
repaint();
}
}
 

解决方案 »

  1.   

    repaint完了要先显示吧。
    SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() 
                {      
                    repaint;//第一次显示
                }
            });
    SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() 
                {      
                    repaint;//第二次显示
                }
            });
    自己没试过。觉得应该是有个先后过程的。
      

  2.   

    先检查repaint()是否是显示图像的面板调用的,
    如果还不行,就用其他更新方法试试,如validate(),revalidate()等。
      

  3.   

    repaint这个函数会由系统专门的一个线程来调用, 这个线程调用repaint的时候,如果检测到有多个调用repaint的请求,只会执行一次repaint。有兴趣的话你可以查一下Swing里有关于cdt的东西。你的代码我没有很仔细看,但我认为你的设计上有点问题,建议是:每一个timer里面都只计算逻辑部分,repaint可以单独放到一个线程里面,当然,如果你非要放到timer里,也只能放一次,或者说按照你现在的这个代码,把每一帧暂停的时间放长一点应该会好一些。就是这些,希望能对你有帮助