Java多线程 - 跳过代码行?

时间:2012-03-17 18:21:54

标签: java

我一直在制作一个可以在其上玩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的新用户,所以如果我提供太多或太少的代码,或者出了什么问题,我道歉。

2 个答案:

答案 0 :(得分:0)

我建议你在Swing主题中完成所有绘图。您可以通过在PongBall线程中使用SwingUtilities.invokeLater来包含更新GUI的所有代码来实现此目的。

这可以避免GUI中的任何多线程问题,因为只使用一个线程来更新显示。

答案 1 :(得分:0)

我认为你犯了两个错误。 首先,你应该调用方法“start()”来启动一个线程,而不是“run()”。 其次,如何存档Swing Component的Graphics对象?不要使用方法“getGraphics()”,它不起作用。你应该覆盖方法paintComponent(Graphics g)。