ホームページ >Java >&#&チュートリアル >Java アプリケーションで複数の跳ねるボールを互いに上書きせずに表示するにはどうすればよいですか?

Java アプリケーションで複数の跳ねるボールを互いに上書きせずに表示するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-10 02:00:09568ブラウズ

How Can I Display Multiple Bouncing Balls in a Java Application Without Overwriting Each Other?

Java でボールが跳ねる

問題: Java アプリケーションに複数のボールを追加すると、最初のボールが生成される2 番目によって上書きされるため、表示されるのは 1 つだけになりますball.

解決策:

この問題を解決し、画面上に複数の跳ねるボールを描画するには、次の方法を検討してください。

< h4>1.非不透明なレイアウト マネージャーの使用とサイズ変更のオーバーライド:

  • コンポーネントの重なりを防ぎ、ボールのサイズと位置を適切に制御するには、不透明なレイアウト マネージャーを削除します。
  • 独自のレイアウトマネージャーを実装して、ボールのサイズと位置を制御しますペイン。

2.ボールのプロパティをランダム化:

  • 各ボールの速度と開始位置をランダム化して、ボールが衝突したり、同じ位置から始まる可能性を減らします。

3.イベント ディスパッチ スレッド (EDT) を使用します:

  • EDT のコンテキスト内でボールを更新し、スムーズで一貫性のあるグラフィック更新を保証します。

< ;h4>4.ボールのコンテナ クラスを使用する:

  • ボールを不透明なコンポーネントとして扱う代わりに、各ボールの色、速度、位置などのプロパティを表すクラスを作成します。ビジュアルはレンダリングしません。

5.ボールの移動用に別のスレッドを作成します:

  • このアプローチの実装はリソースを大量に消費する可能性があるため、最初に他の代替案を検討してください。

コードサンプル (コンテナクラスの使用) Balls):

public class Balls extends JPanel {

    private List<Ball> ballsUp;

    // ... (Constructor and other methods)

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (Ball ball : ballsUp) {
            ball.paint(g2d);
        }
        g2d.dispose();
    }

    public List<Ball> getBalls() {
        return ballsUp;
    }
}

public class Ball {

    private Color color;
    private Point location;
    private Dimension size;
    private Point speed;

    // ... (Constructor and other methods)

    protected void paint(Graphics2D g2d) {

        Point p = getLocation();
        if (p != null) {
            g2d.setColor(getColor());
            Dimension size = getSize();
            g2d.fillOval(p.x, p.y, size.width, size.height);
        }

    }
}

public class BounceEngine implements Runnable {

    private Balls parent;

    // ... (Constructor and other methods)

    public void run() {

        // Randomize ball properties and starting positions
        for (Ball ball : getParent().getBalls()) {
            // ... (Randomization logic)
        }

        while (getParent().isVisible()) {

            // Repaint the balls
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    getParent().repaint();
                }
            });

            // Move each ball
            for (Ball ball : getParent().getBalls()) {
                move(ball);
            }

            // Delay between updates
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }

        }

    }

    // ... (Remaining code)

}

コンテナ クラスとボールの動きに別個のスレッドを使用するこのアプローチにより、ボールの動作をより詳細に制御でき、より複雑なボール アニメーションが可能になります。

以上がJava アプリケーションで複数の跳ねるボールを互いに上書きせずに表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。