java - repaint()エラー。私の再描画メソッドは画面を点滅させるだけです

java

私は私の問題がどこから来ているのかを理解したと思います。 repaint()をコメントアウトすると、通常取得するものを取得できます。四角形と2台の車を使用して作成した競馬場を上映します。 repaint()をコメントアウトしたため、移動するようには見えません。そのまま実行すると、プログラムは2つのことのどちらかを行います。機能しないか、約3〜5回点滅してから停止します。 sleep()をコメントアウトすると、プログラムは終了するまで点滅し続けます。車は本来の動きをしています。何が悪いのかわかりません。必要に応じて、実際のトラックのコードも含めることができます。それは長い道のりであり、私はこれに絞り込んだと思います。

private class MoveTwo extends Thread{
    public void run(){
        //infinite loop
        while(true){
            try{
                repaint();//Refresh Screen
                if(playerTwoSpeed<=5) playerTwoSpeed+=.2;//slow acceleration

                playerTwo.y-=playerTwoSpeed;
                Thread.sleep(100);//Delay
            } catch(Exception e){
                break;//Stop if there is an error
            }
        }
    }
}


どうぞ:

public void paint(Graphics g){
    super.paint(g);
    g.setColor(Color.DARK_GRAY);
    g.fillRect(0, 0, WIDTH, HEIGHT);

    //Turn Border green when we draw.
    g.setColor(Color.GREEN);

    //fill rectangles.
    g.fillRect(left.x, left.y, left.width, left.height);
    g.fillRect(right.x, right.y, right.width, right.height);
    g.fillRect(top.x, top.y, top.width, top.height);
    g.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);
    g.fillRect(center.x, center.y, center.width, center.height);
    g.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
    g.fillRect(obstacle2.x, obstacle2.y, obstacle2.width, obstacle2.height);
    g.fillRect(obstacle3.x, obstacle3.y, obstacle3.width, obstacle3.height);
    g.fillRect(obstacle4.x, obstacle4.y, obstacle4.width, obstacle4.height);
    g.fillRect(obstacle5.x, obstacle5.y, obstacle5.width, obstacle5.height);

    g.setColor(Color.WHITE);//Change color to white.
    g.fillRect(outerStart.x, outerStart.y, outerStart.width, outerStart.height);
    g.fillRect(innerStart.x, innerStart.y, innerStart.width, innerStart.height);

    g.setColor(Color.YELLOW);
    g.fillRect(finish.x, finish.y, finish.width, finish.height);

    //Player one is blue
    g.setColor(Color.BLUE);
    g.fill3DRect(playerOne.x, playerOne.y, playerOne.width, playerOne.height, true);

    g.setColor(Color.RED);
    g.fill3DRect(playerTwo.x, playerTwo.y, playerTwo.width, playerTwo.height, true);

}
答え
おそらく、JFrameサブクラスのpaintメソッドのオーバーライドを使用します。 JFrameは重いコンポーネントであるため、多くのOSで点滅が発生します。解決策は、JComponent(通常はJPanel)のpaintComponentメソッドのオーバーライドを使用することです。コードは同じですが、Swingフレームワークによりスムーズに統合されます。

また、スレッドをより適切に制御することを検討する必要があります。whiletrucループは...停止するのが困難です。 :)

ブールフラグとメソッドを使用して、フラグをtrueまたはfalseに設定する必要があります。

よろしく、
ステファン
関連記事

java - Androidでラテン語のアクセント付き文字を使用する方法

java - Androidレイアウトの遷移効果

java - JavaでWebサービスを介して複数のセッション要求を維持する

java - リソースをSDカードにコピーすると、Androidで破損したファイルが表示されます

java - JavaScriptのような構文を自分のJavaメソッドに解析する

java - IllegalArgumentException:オブジェクトの配列をSCHEMA_SOURCEプロパティの値として使用する場合、2つのスキーマが同じtargetNamespaceを共有することはできません

java - Notnoop / java-apnsプッシュ

java - iTextを使用してJSPでPDFファイルの限られた数のページを表示する方法は?

java - サーバー側のJax-rs呼び出しをプレフィックスのないネイティブファイルと混在させる方法は?

java - プリミティブのJavaジェネリックメソッド