これは私の最初の試みで、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();
}
}
この例では、すべての私の問題を解決しました。ありがとうございます! 1つの質問:このメソッドは、BuffalStrategyメソッドを使用する場合と同じように、リソースにやさしく、bs.show()を実行しますか?つまり、グラフィックスカードがすべて苦労するのですか? –
良い質問:それは、ホストプラットフォームのベストエフォートを使用する抽象度がやや高いレベルで動作します。すべての 'JComponent'サブクラスは' Component'のバッファー戦略を継承しています。 – trashgod
@フリーアクジラもう一つの重要な問題があります。1)bs.getDrawGraphics();スナップショットのみであり、すべてのペイントはコード行Thread.sleep(int)によって殺されます;代わりにSwing Timerを使用します – mKorbel