2

BufferedImage と JPanel に少し問題があります。2D アニメーションを使用したゲームを作成しています。

基本的に、写真をループする animationHandler があり、回転に応じて正しく表示されます。しかし、問題は、写真をロードすると、Jpanel が何も描画しないことです。カスタムペイントメソッドをコメントアウトしてもイベントは問題になりません.paintComponentメソッドは何も描画せず、paintCompontentメソッドをスキップするようです. ゲームはクラッシュせず、タイマーはまだ実行中ですが、拡張された JPanel で paintComponent メソッドを使用しません。

タイマーを含むクラス - JPanel.repaint(); を介して JPanel を呼び出します。

これがloadImgメソッドです

/**
 * Test method to check animationHandler and bufferedImgs
 */
private void loadImages() {
    BufferedImage b_1;
    BufferedImage b_2;
    BufferedImage b_3;
    BufferedImage b_4;
    BufferedImage b_5;

    BufferedImage[] imgs = new BufferedImage[5];
    try {
        b_1 = ImageIO.read(new File("warlock1.png"));
        b_2 = ImageIO.read(new File("warlock2.png"));
        b_3 = ImageIO.read(new File("warlock3.png"));
        b_4 = ImageIO.read(new File("warlock4.png"));
        b_5 = ImageIO.read(new File("warlock5.png"));

        imgs[0] = b_1;
        imgs[1] = b_2;
        imgs[2] = b_3;
        imgs[3] = b_4;
        imgs[4] = b_5;

        animationHandler.addAnimation(imgs);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

乾杯!

4

1 に答える 1

5

Swing イベント スレッドまたは EDT (Event Dispatch Thread) でイメージをロードしている可能性があります。EDT はすべての Swing グラフィックとユーザー インタラクションを処理するため、ロードが完了するまで Swing アプリケーションがフリーズします。解決策: SwingWorker オブジェクトから取得できるようなバックグラウンド スレッドに画像をロードします。このテーマの詳細については、Swing の同時実行のチュートリアルを確認してください。

また、可能であれば、画像が大きすぎない場合は、通常、画像を一度ロードしてから、それらへの参照または ImageIcon への参照を保持することをお勧めします。

最後に、何をするにしても、メソッド内で画像を読み込まないでくださいpaintComponent(...)。この方法は無駄がなく、意地悪である必要があります。可能な限り高速で、描画のみに関係する必要があります。そうしないと、プログラムの応答性が非常に遅くなる可能性があります。

また、以下について:

拡張 JPanel で paintComponent メソッドを使用しません。

このコードを見せてください。

于 2012-06-02T23:01:59.387 に答える