【问题标题】:Java - how to create bufferedStrategy to jframeJava - 如何为 jframe 创建 bufferedStrategy
【发布时间】:2019-02-12 03:37:04
【问题描述】:

我是使用 java2Djava Graphics 的新手,我在 java 中使用 BufferStrategy 时遇到了一些问题,我尝试解决但它在创建时不起作用BufferStrategy 它给出了这样的错误......

Exception in thread "Thread-0" java.lang.IllegalStateException: Component must have a valid peer
at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:4006)
at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3980)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4503)
at java.awt.Component.createBufferStrategy(Component.java:3857)
at java.awt.Canvas.createBufferStrategy(Canvas.java:194)
at java.awt.Component.createBufferStrategy(Component.java:3781)
at java.awt.Canvas.createBufferStrategy(Canvas.java:169)
at code.Main.render(Main.java:84)
at code.Main.run(Main.java:31)
at java.lang.Thread.run(Thread.java:745)
BUILD SUCCESSFUL (total time: 24 seconds)

我在YouTube tutorial 中获取了这个项目的大部分代码,"at code.Main.render(Main.java:84)" 指向这个渲染方法

private void render()
{
   bufferStrategy= display.getCanvas().getBufferStrategy(); //getting bufferstrategy
   if(bufferStrategy==null)
   {
       display.getCanvas().createBufferStrategy(3);// creating bufferstrategy, output says error in this line
       return;
   }
   g= bufferStrategy.getDrawGraphics(); 
   g.fillRect(1,1,width,height);//draw a rectangle
   bufferStrategy.show();//show all things (build-in method)
   g.dispose();
}

第二个错误是在调用render()方法时

public void run()                           //override run to Runnable
{
    initialize();                           //create and initialize Display frame and canvas

    while (runningStatues)                  //works when game is already running
    {
        tick();                             //update variables, have no code here
        render();                           // here is contain error
    }
    stop();
}

我觉得这对我来说太复杂了,谢谢你的帮助:)

【问题讨论】:

    标签: java graphics render bufferstrategy


    【解决方案1】:

    组件必须有一个有效的对等体

    这是(试图)告诉您的是,您已经尝试在屏幕上实现底层窗口之前创建一个BufferStrategy - 这意味着,附加到一个本地对等点。在 AWT/Swing 中,窗口在第一次调整大小或使其可见时才被实现。

    因此,作为一般性建议,在您尝试创建 BufferStrategy 之前使窗口可见

    我强烈建议您查看JavaDocs for BufferStrategy,因为它有一个推荐工作流程的极好示例,您可以以此为基础制定解决方案。

    我还建议您查看BufferStrategy and BufferCapabilities trail,因为它包含许多可运行的示例,您可以使用这些示例

    我还建议不要使用框架的BufferStrategy,而是使用添加到框架的Canvas,这将阻止您在窗口边框下方进行绘画

    您可以考虑查看What is the correct way to use createBufferStrategy()? 之类的可运行示例

    【讨论】:

    • 我阅读了链接,我正在使用画布创建BufferStrategy,并且我的框架是在创建BufferStrategy之前创建的,它在调用render()创建@之前在initialize()中创建框架987654333@
    • 我想问是否有更简单的方法来渲染一个简单的矩形而不是使用BufferStrategy
    • 哦,我发现了这个错误!在Display 类(包含框架)中,我在将画布添加到我的JFrame 之前尝试创建缓冲区,我想你想通过>“在创建BufferStrategy 之前让窗口(可见)”来告诉我这一点,我以为你的意思是frame.setVisible(true);。感谢您的帮助,直到我深入阅读您的答案,我才明白,真的谢谢你=)
    • @mhamadarsalan 是的,我建议setVisible,但只要窗口已附加到本地对等点,它应该可以工作(setVisible 我认为setSize 触发创建原生同行)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多