0

BufferStrategyオブジェクトによって作成されたを使用してJFrame形状をペイントするアプリケーションがあります。コードは非常に標準的で、他の場所で見つけることができます。

// JFrame class
frame.setVisible( true );
frame.createBufferStrategy( 2 );
new Logic( frame.getBufferStrategy() ).loop();

// Logic class
public Logic( BufferStrategy bs ){
        this.bs = bs;
}

public void loop(){
    // looping should be in another thread
    Thread loop = new Thread(new Runnable() {
        public void run(){
            looooooooop();
        }
    });
    loop.start();
}

関数looooooooopは、実際に描画が行われている場所です。

g = (Graphics2D)bs.getDrawGraphics();

// draw stuff here, leaving out for simplicity

g.dispose();
bs.show();
Toolkit.getDefaultToolkit().sync();

現在、問題は、アプリケーションが起動して正常に実行される時間の約 75% であり、残りの 25% の時間はフレームが表示されますが、フレームの背景色しか表示されず、グラフィック オブジェクトが描画されていないようです。画面上の何でも。私はデバッグを試み、この問題が発生しているかどうかを調べましたが、そうするのは本当に難しいです。私はそれが別のスレッドで実行されているロジックループと関係があると考えています(おそらくこれはアプリケーションの一貫性のない性質を説明しています)が、うまくいきませんでした. この問題は誰にとってもおなじみのように聞こえますか? ありがとう!

編集- 別のスレッドを削除した後も、これはまだ発生しているため、それが原因ではありません。

編集 2 - フルスクリーン モードが有効になっている場合にのみ発生しているようです (への呼び出しの有無にかかわらずsetVisible()):

this.setVisible( true );

if(isFullScreen){
    GraphicsEnvironment
        .getLocalGraphicsEnvironment()
        .getDefaultScreenDevice()
        .setFullScreenWindow(this);     
}

これは既知の問題ですか、それとも何か不足していますか? ありがとう!

編集 3 - これは Ubuntu でのみ発生しています - 力ずくで検証されています。バグに関してオンラインで何も見つからないため、どう考えればよいかわかりません。

4

1 に答える 1

0

スレッドを作成する必要があると思われる場合 (私はそうは思いません)、代わりに次のようにします。

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      looooooooop();
    }
});

新しいスレッドを作成せずに試してみることをお勧めします。

アップデート:

これらのイベントを次の順序で試してください。

// Create a canvas object (where you are actually doing the drawing)

frame.add(canvas);
frame.setVisible(true);

canvas.createBufferStrategy(2);
canvas.requestFocus();

// Do your drawing now.

表示される前にバッファーを作成することはできません。pack()また、コードのどこかでフレームを呼び出している場合は、それを削除してください。

于 2014-12-28T16:45:41.627 に答える