0

我有一个使用BufferStrategyJFrame对象创建的应用程序来绘制形状。该代码非常标准,您可以在其他地方找到:

// 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 回答