0

現在、paintComponent メソッドを変更する JComponent を拡張するコンポーネントを追加することで、Java で四角形、楕円形、および線を描画できます。

public class myComponent extends JComponent
{
   public void paintComponent(Graphics g)
   {
    /* do simple draw stuff */
   }
}

クラスに JApplet または JPanel のいずれかを拡張させてから、ペイント メソッドを描画する方法も知っています。

public class myClass extends JPanel
{
   public void paint(Graphics g)
   {
    /* do simple draw stuff */
   }
}

しかし、これらの方法はどちらも、パラメーターを渡すことができないという問題があります。マルチフレームのアニメーション化されたスプライトの場合、フレーム番号を決定するために読み取る外部変数を持つことができ、そのフレーム番号に基づいて適切な「スプライト」コンテンツのみを内部的に描画しますが、できるようにしたいと思いますフレーム番号を直接渡します。残念ながら、これがどこから呼び出されたのかわからないだけでなく、入力として必要な Graphics g の場所もわかりません。

描画ルーチンと直接通信して、必要なときにいつでも必要なものだけを描画するように指示する、私が望むものを達成するためのより良い方法があるかもしれませんが、これを達成する方法がわかりません.

そのような方法が可能である場合、それはどのように行われますか? 既存の paint または paintComponent メソッドを使用する方がよい場合、それらに追加情報を渡すにはどうすればよいでしょうか?


どうやら私が質問した内容が明確ではなかったようです。独自の paintComponent または paint メソッドを持つコンポーネントまたはその他のエンティティが必要です。その内部には、渡された frameNumber パラメータ、または明らかにより可能性が高いように、frameNumber などのクラス プロパティに基づいています。アクセスすると、メソッドはスプライトのどのフレームを描画するかを決定します。

ただし、重要なことは、フレーム番号が変更されたときに、paint または paintComponent を再呼び出ししてスプライトを再描画できるようにしたいということです。私の大きな混乱は、メソッドを再呼び出しする方法がわからないことにあります。これは、私の理解では、フレームのサイズが変更されたとき、または再描画されたときにのみ呼び出されます。

では、コンポーネント/オブジェクト/エンティティをフレームごとに再描画するにはどうすればよいですか?

4

3 に答える 3

1

おそらく、フレーム番号を決定するために読み取る外部変数を使用し、そのフレーム番号に基づいて適切な「スプライト」コンテンツのみを内部的に描画することができます

クラスには、インスタンス変数などの内部状態が必要です。

paintその後、メソッド内でそれらを検査できます。

于 2013-07-10T23:39:34.623 に答える
1

「メンバー変数」と考えてください。

public class MyClass extends JPanel {

   private final int frameNumber;

   public MyClass() { 
       this(0);
   }

   public MyClass(int f) { 
       this.frameNumber = f; 
   }

   public void paint(Graphics g)
   {
       if (this.frameNumber == x) {
        /* do simple draw stuff */
       }
   }
}
于 2013-07-10T23:39:52.407 に答える
1

まず、 をオーバーライドせずpaint、 を使用しますpaintComponent

次に、すべてのグラフィカル オブジェクトの状態を記録する何らかのモデルを定義する必要があります。が呼び出されたらpaintComponent、その状態をレンダリングする必要があります。ペイント メソッドにパラメーターを渡そうとする代わりに、ペイント メソッドがモデル (つまりgetModel) にアクセスできるようにするメソッドが必要です。

次に、更新エンジンがモデルを更新し、コンポーネントがそのモデルをペイントします

例として...キーが押されたときにタイマーを使用する

于 2013-07-10T23:41:58.803 に答える