【问题标题】:BufferStrategy Not Always Showing on JFrameBufferStrategy 并不总是显示在 JFrame 上
【发布时间】:2014-12-28 15:57:38
【问题描述】:

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

// 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 上 - 通过蛮力验证。在网上找不到任何关于错误的信息,所以我不知道该怎么想。

【问题讨论】:

  • 您是否尝试过循环内容状态,正如 Oracle 在此处演示的那样:java.awt.image.BufferStrategy
  • @Obicere 我不想说这并没有解决我的问题,但我的应用程序现在运行得更顺畅了。谢谢!

标签: java java-2d bufferstrategy


【解决方案1】:

如果您认为有必要创建一个线程(我不这么认为),我会这样做:

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(),只需将其删除。

【讨论】:

  • 感谢您的建议。实际上,我只是尝试使用 invokeLater 方法并一起完全删除新线程,但这种情况仍在发生。
  • 您的更新似乎也不起作用。我现在只是对可能导致这种情况的原因感到困惑。
猜你喜欢
  • 2013-10-14
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多