我有这个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,它的工作就像一个魅力,但现在我需要它作为应用程序。
答案 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相关操作有一定的兴趣。