我一直在制作一个可以在其上玩Pong的程序,而且我对多线程比较陌生。当我运行这段代码时,它应该在左上角显示一个小盒子,其中一个球在盒子里反弹,在中心有一个大矩形。球来了,但矩形没有。
private void gameRender() {
if( dbImage == null ) {
dbImage = createImage( dbWIDTH, dbHEIGHT );
if( dbImage == null ) {
JOptionPane.showMessageDialog( null, "dbImage is null", "Error", JOptionPane.ERROR_MESSAGE );
return;
}
else
dbg = dbImage.getGraphics();
}
dbg.setColor( Color.white );
dbg.fillRect( 100, 150, dbWIDTH, dbHEIGHT );
dbg.setColor( Color.blue );
dbg.drawRect( 110, 110, 10, 5 );
g = getGraphics();
ball = new PongBall( g );
ball.run();
if( gameOver )
JOptionPane.showMessageDialog( null, "GAME OVER", "GAME OVER", JOptionPane.ERROR_MESSAGE );
}
这是PongBall线程
class PongBall extends Thread {
private boolean keepGoing;
private Graphics g;
private int x = 7, xChange = 7;
private int y = 0, yChange = 2;
private int diameter = 10;
private int rectLeftX = 0, rectRightX = 100;
private int rectTopY = 0, rectBottomY = 100;
public PongBall( Graphics graphics ) {
g = graphics;
keepGoing = true;
}
public void pleaseStop() { keepGoing = false; }
public void run() {
g.drawRect( rectLeftX, rectTopY, rectRightX - rectLeftX, rectBottomY - rectTopY );
while( keepGoing ) {
g.setColor( Color.white );
g.fillOval( x, y, diameter, diameter );
if( x + xChange <= rectLeftX )
xChange = -xChange;
if( x + xChange >= rectRightX )
xChange = -xChange;
if( y + yChange <= rectTopY )
yChange = -yChange;
if( y + yChange >= rectBottomY )
yChange = -yChange;
x = x + xChange;
y = y + yChange;
g.setColor( Color.red );
g.fillOval( x, y, diameter, diameter );
try {
Thread.sleep( 50 );
}
catch( InterruptedException e ) {
System.err.println( "sleep exception" );
}
}
}
} 你可能会看到,“dbg.fillRect(100,150,dbWIDTH,dbHEIGHT);”被跳过,ball.run()只是运行。有什么我不做的事情,我该如何解决这个问题?
另外,我是stackoverflow.com的新用户,所以如果我提供太多或太少的代码,或者出了什么问题,我道歉。
答案 0 :(得分:0)
我建议你在Swing主题中完成所有绘图。您可以通过在PongBall线程中使用SwingUtilities.invokeLater来包含更新GUI的所有代码来实现此目的。
这可以避免GUI中的任何多线程问题,因为只使用一个线程来更新显示。
答案 1 :(得分:0)
我认为你犯了两个错误。 首先,你应该调用方法“start()”来启动一个线程,而不是“run()”。 其次,如何存档Swing Component的Graphics对象?不要使用方法“getGraphics()”,它不起作用。你应该覆盖方法paintComponent(Graphics g)。