2011-08-01 3 views
1

私は単純なスペースシャッターを書くつもりです。私はrepaint()メソッドがリクエストにすぎず、呼び出されるたびに実行されないことを読んでいます。私は、私の宇宙船が動いているときにそれほど苦労していないので、私はこれの影響に気づいていると信じています。現在、JPanelのpaintComponent()メソッドで私の船を描くだけで、定期的にrepaint()を呼び出しています(私のパネルもRunnableです)。 repaint()が私を倒してしまう可能性があることを見て、私はarroundを動作させる方法を見つけようとしていますが、アイデアがなくなってしまいました。コード私がこれまで持っている:Javaで私の方法arround repaint()を操作する

private void renderGraphics() { 
    if (MyImage == null) { 
     MyImage = new BufferedImage(getPreferredSize().width, 
       getPreferredSize().height, BufferedImage.TYPE_INT_RGB); 
    } 
    MyGraphics = MyImage.getGraphics(); 
    MyGraphics.setColor(Color.BLACK); 
    MyGraphics.fillRect(0, 0, getPreferredSize().width, getPreferredSize().height); 
    MyGraphics.drawImage(ship.getImage(), ship.getCurrentX(), ship.getCurrentY(), null);  
} 

アイデアは私自身のグラフィックを作成し、JPanelのは、それを描画しますが、この代わりに、再描画の()私の目で()メソッドを呼び出しておくことでした、しかし、私が持っていますどのようにそれを行うか分かりません。私はその問題についてどんな入力をも心得ています。

答えて

4

これには複数の方法があります。

ベストはおそらくBufferStrategyを使用し、その中で私はあなたのために動作するコードスニペットを含んでいます。

Frame/BufferStrategyを使用するだけで、これをさらに進めて、スイングを完全に放棄することができます。ここでは、とにかく

AWT custom rendering - capture smooth resizes and eliminate resize flicker

あなただけでドロップすることができるはず実装BufferStrategyです:そこの完全実施例は、(そこからコードスニペットをとり、適応させた)ここで私の質問にある

ちょうどあなたがここに投稿コードの
// you should be extending JFrame 
public void addNotify() { 
    super.addNotify(); 
    createBufferStrategy(2); 
} 

private synchronized void render() { 
    BufferStrategy strategy = getBufferStrategy(); 
    if (strategy==null) return; 
    sizeChanged = false; 
    // Render single frame 
    do { 
     // The following loop ensures that the contents of the drawing buffer 
     // are consistent in case the underlying surface was recreated 
     do { 
      MyGraphics draw = strategy.getDrawGraphics(); 
      draw.setColor(Color.BLACK); 
      draw.fillRect(0, 0, getPreferredSize().width, getPreferredSize().height); 
      draw.drawImage(ship.getImage(), ship.getCurrentX(), ship.getCurrentY(), null); 
      draw.dispose(); 

      // Repeat the rendering if the drawing buffer contents 
      // were restored 
     } while (strategy.contentsRestored()); 

     // Display the buffer 
     strategy.show(); 

     // Repeat the rendering if the drawing buffer was lost 
    } while (strategy.contentsLost()); 
} 
+0

これはまさに私が探していたものです。ありがとうございました。 –

2

スイングスレッドではまだ描画が行われますので、何を回避しても問題はありません。

は、あなたが、これは、すぐにそれは2つの部分に

2

別々のすべてのロジックを実行する必要があるとして実行されてから再描画を停止することができるスイングスレッド内の任意の長い計算を行っていないことを確認してください。静的および動的。 (海や動いている船など)船の静的な画像上の形や位置が変わる船舶

静的コンテンツを一度イメージに描き、paintComponent()でイメージを使用します。静止画の後にダイナミックパーツペインティングを呼び出します。

setClip()を使用して、再塗りつぶし領域を制限します。

2

1 /あなたはImage/ImageIconを表示したい場合は、最良かつ最も簡単な方法は、Use Labels

にあります

2 /ご紹介のとおりRunnable{...}.start();スイングは単純なスレッドで、GUIへの出力はすべてEDTで行う必要があります。あなたはConcurrency in Swingを見ていると、結果は/追加/削除/変更perfomancieに問題がinvokeAndWait()

3 /へ、その後がある場合、あなたは(JComponents間の)スイッチであればBackGround Task(s)からのすべての出力がinvokeLater()に包まれた、としなければならないということですLayoutその後、あなたは具体的なコードブロックに

EDIT最後の行としてrevalidate() + repaint()を呼び出す必要があり:

汚いハックがウィットを再描画呼び出しpaintImmediately()

2

だろうがhoutすべての引数は、パネル全体が再描画されることを意味します。

画面の一部を再描画する必要がある場合(宇宙船が別の場所に移動した場合)、画面の一部だけを再描画するようにしてください。同じままになっている領域には触れてはいけません。

Repaintは、再描画する必要がある矩形の座標をとります。船を動かすとき、あなたは船の古い座標と船が移動すべき座標を知るべきです。

repaint(oldShipCoordinateX, oldShipCoordinateY, shipWidth, shipLength); 
repaint(newShipCoordinateX, newShipCoordinateY, shipWidth, shipLength); 

これは通常、引数なしでrepaint()を呼び出すよりもはるかに高速です。しかし、あなたは船の最後の位置を覚えている余分な努力があり、船の新しい位置を計算することができなければなりません。特に3

+0

これはリソースを節約するための良い解決策のようですが、質問に答える:スクリーン上に複数の動くオブジェクトがある場合、パラメータを使ってrepaint()を呼び出す価値はあるのだろうか? (例えば、宇宙船、発射物、流入する流星) –

+0

良い点。そのことを念頭に置いて、私はチャールズ・グッドウィンの答えがあなたのニーズにはるかに適しているとも思っています。彼のために+1。 – david

1

は私が再描画()メソッドが唯一の要求であることを読んだ段階、それはそれは統合

と呼ばれるたびに実行されません - http://download.oracle.com/javase/tutorial/uiswing/painting/index.html

も参照してください。より効率的に複数のrepaint()リクエストを1つに変換する

私は宇宙船が動いているときに私の宇宙船が少し遅れる傾向があるので、私はこれの影響に気づいていると思います。

この問題を示すSSCCEを投稿してください。私は問題があなたのコードだと思う。

あなたが受け入れた解決策については、チャールズの最後の投稿:Swing/JFrame vs AWT/Frame for rendering outside the EDTとSwingとAWTのソリューションを比較してみてください。

関連する問題