1

いろいろ調べた結果、JLabel を拡張してカスタム イメージ コンポーネントを実装するのが最善であることがわかりました。これまでのところ、複数の「画像」(レイアウトを壊さずにjlabels)を追加できるので、うまくいきました。誰かが私に答えてくれることを願っています。

  • 画面全体で JLabels をアニメーション化するには、コンポーネントを必要とし、最終的にアニメーション化するsetlayout(null);必要があることに気付きました。これはコンポーネントをアニメーション化するためのベスト プラクティスですか、それともひどい方法ですか? 最終的にはアニメーションのクラスを作る予定ですが、やりたくないのでやめなければなりません。setboundssetlocation(x,y);

簡単なレビューチェックのために関連コードを含めました。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GraphicsPanel extends JPanel  {
    private Timer timer;
    private long startTime = 0;
    private int numFrames = 0;
    private float fps = 0.0f;
    private int x = 0;

    GraphicsPanel() {
        final Entity ent1 = new Entity();
        ent1.setBounds(x, 0, ent1.getWidth(), ent1.getHeight());
        add(ent1);

        //ESSENTIAL
        setLayout(null);

        //GAMELOOP
        timer = new Timer(30, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                getFPS();
                incX();
                ent1.setLocation(x, 0);
                repaint();
            }
        });
        timer.start();
    }

    public void incX() { x++; }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setClip(0, 0, getWidth(), getHeight());

        g2.setColor(Color.BLACK);
        g2.drawString("FPS: " + fps, 1, 15);
    }

    public void getFPS()
    {
        ++numFrames;
        if (startTime == 0) {
            startTime = System.currentTimeMillis();
        } else {
            long currentTime = System.currentTimeMillis();
            long delta = (currentTime - startTime);
            if (delta > 1000) {
                fps = (numFrames * 1000) / delta;
                numFrames = 0;
                startTime = currentTime;              
            }
        }
    }
}

ありがとうございました!

4

1 に答える 1

4

画面全体で JLabels をアニメーション化するには、setlayout(null); が必要であることに気付きました。コンポーネントの setbounds を実行し、最終的に setlocation(x,y); をアニメーション化します。これはコンポーネントをアニメーション化するためのベスト プラクティスですか、それともひどい方法ですか?

まあ、これは完全に真実ではありません。場所をいじるだけで、ラベルが画面上を移動します。ただし、フレームなどのサイズを変更すると、レイアウト マネージャーが呼び出され、ラベルが再配置され、FlowLayout の場合はパネルの上部/左側になるレイアウト マネージャーによって定義された場所が変更されます。アニメーションはその場所から続きます。実際には、はい、これはまさにあなたがする必要があることです.

Swing はコンポーネントの「最後の」位置を (背景を復元するために) 自動的に再描画し、コンポーネントの新しい位置を描画するため、アニメーションを行う最も簡単な方法だと思います。これはすべて、単一の setLocation() メソッドによって実現されます。

パネルに直接画像を描画してカスタム ペイントを行うことを好む人もいますが、その場合は、画像の古い場所をクリアして背景を再描画し、新しい場所に画像を描画する必要があります。これはやりすぎだと思います。

于 2010-03-18T03:13:15.463 に答える