Java应用程序:在While循环中不执行重绘?

时间:2011-07-21 13:47:45

标签: java swing repaint

我有这个Thread应该更新游戏的元素,即重新绘制,等待一段时间然后重新做,问题是它不会重新绘制。我已经测试了所有其他组件,它们都可以工作,但paint方法只被调用一次(因为组件被绘制),即使我在循环中调用repaint()。这是我的循环代码:

Thread t = new Thread(){
public void run()
    {
        mouse.init();
        while(true)
        {                                       
         mouse.Refresh();//Adds Dirty Regions in the RepaintManager   
        SwingUtilities.invokeLater(new Runnable() {    
       @Override 
       public void run() {              
          //What here? 
       }
    });


        }            
    }
};

无需查看线程或任何内容,它会循环播放。

这是油漆方法:

   @Override
public void paint(Graphics g)
{

            EndTime = System.currentTimeMillis();//For the FPS Counter
    Time = EndTime - StartTime;
    FPS = (byte) (1000/Time);   
    TotalFPS += FPS;
    TotalFrame++;   
            JPT.AverageFPs.setText( "" + TotalFPS/TotalFrame);
            JPT.CurrentFPS.setText( "" + FPS);
    StartTime = System.currentTimeMillis();

    g.clearRect(0,0,dim.width,dim.width); 


    for(int x = 0; x < Variables.Width; x++)
    {
        for(int y = 0; y < Variables.Height; y++)
        {
            if(Variables.Map[x][y] == 0)
            { 
                g.setColor(new Color(0x613F37));
                g.drawLine(x, y, x, y);
            }
            else if(Variables.Map[x][y] == 1)
            { 
                g.setColor(Color.black);
                g.drawLine(x, y, x, y);
            }
            else if(Variables.Map[x][y] == 2)
            { 
                g.setColor(new Color(0xDEDEDE));
                g.drawLine(x, y, x, y);
            }

        }
    }

        g.setColor( new Color(0.5f, 0.5f, 0.5f, 0.5f));
        g.fillRect(Variables.CurrentX, Variables.CurrentY, Variables.Zoom, Variables.Zoom);





}

提前多多谢谢。

另外我想指出的是,我之前将这个游戏作为Applet,它的工作就像一个魅力,但现在我需要它作为应用程序。

4 个答案:

答案 0 :(得分:3)

尝试paintImmediately(0, 0, getWidth(), getHeight());

答案 1 :(得分:2)

这是因为RepaintManager将多个请求折叠为组件树成员的单个重绘。

答案 2 :(得分:0)

我认为您的数据在线程之间没有同步(没有足够的代码来确定这种情况是否很难)。

在Swing EDT上调用

repaint,并在主线程中调用update.UpdateGravity()。我猜您的update更改了Variable,但您是否曾同步此数据结构,以便Swing EDT看到更新后的值?

修改

这是你应该做的:

variables = update.updateGravity();  // runs in your main thread
SwingUtilities.invokeLater(new Runnable() {    
   @Override public void run() {
       yourCustomSwingComponent.update(variables);   // will run on the Swing EDT
   }
}

yourCustomSwingComponent包含您拥有的paint()方法。 Swing中有一条规则,任何Swing组件的状态只能从Swing EDT修改(或读取)。

您应该阅读有关Swing和多线程的内容。实际上,您必须阅读有关使用Swing的多线程。

答案 3 :(得分:0)

不直接回答这个问题,但是看一些现有的Java2D动画库可能非常有用。例如,Trident最初由Kirill Grouchnikov开发。如果有理由不使用它,至少可以检查来源并借用一些想法。

此外,Swing Timer可能对实现基于时间的Swing相关操作有一定的兴趣。