2012-02-25 3 views
4

これは私の最初の試みで、BufferStrategyを使用しています。私は本当にいくつかのヒントを感謝します。ここではgetSize()が機能しないのですが、サイズ変更時にフリッカーが表示されるのはなぜですか?

1)なぜ、次のコードでgetSize()のサイズを返すのは、ウィンドウのサイズを変更するまでですか?すぐにウィンドウのサイズをどのように検出できますか?

2)なぜgetSize()が何かを返すとき、それはウィンドウの完全な寸法ではありませんか? IEはなぜ黒い帯が底部と右にあるのですか?

3)ウィンドウのサイズを変更したときにちらつきを取り除く方法はありますか?

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BSTest extends JFrame { 
    BufferStrategy bs; 
    DrawPanel panel = new DrawPanel(); 

    public BSTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(800,420); 
     setLocationRelativeTo(null); 
     setIgnoreRepaint(true); 
     setVisible(true); 
     createBufferStrategy(2); 
     bs = getBufferStrategy(); 
     panel.setIgnoreRepaint(true); 
     add(panel); 
     panel.drawStuff(); 
    } 

    public class DrawPanel extends JPanel { 
     public void drawStuff() { 
      while(true) { 
       try { 
        Graphics2D g = (Graphics2D)bs.getDrawGraphics(); 
        g.setColor(Color.BLACK); 
        System.out.println("W:"+getSize().width+", H:"+getSize().height); 
        g.fillRect(0,0,getSize().width,getSize().height); 
        bs.show(); 
        g.dispose(); 
        Thread.sleep(20); 
       } catch (Exception e) { System.exit(0); } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     BSTest bst = new BSTest(); 
    } 
} 

答えて

5
  1. validate()は、典型的には含むWindowpack()を呼び出す結果として、呼び出されるまでJPanelのサイズは有効ではありません。

  2. 最終的なサイズは、囲まれたコンポーネントの好ましいサイズと特定のLook &フィールのパネルUIデリゲートを含む要素の組み合わせの結果です。

  3. JPanelは、デフォルトでダブルバッファされています。それ以上の努力は必要ありません。 AnimationTestがその例です。

+0

この例では、すべての私の問題を解決しました。ありがとうございます! 1つの質問:このメソッドは、BuffalStrategyメソッドを使用する場合と同じように、リソースにやさしく、bs.show()を実行しますか?つまり、グラフィックスカードがすべて苦労するのですか? –

+0

良い質問:それは、ホストプラットフォームのベストエフォートを使用する抽象度がやや高いレベルで動作します。すべての 'JComponent'サブクラスは' Component'のバッファー戦略を継承しています。 – trashgod

+2

@フリーアクジラもう一つの重要な問題があります。1)bs.getDrawGraphics();スナップショットのみであり、すべてのペイントはコード行Thread.sleep(int)によって殺されます;代わりにSwing Timerを使用します – mKorbel

関連する問題