【问题标题】:Using java bufferstrategy and swing elements at the same time同时使用java bufferstrategy和swing元素
【发布时间】:2014-08-18 20:10:24
【问题描述】:

我现在编写了一个简单的 RTS 游戏,这是我在游戏设计方面的第一次体验。我的问题是,当我使用 createBufferStrategy(2) 时,在 bufferStrategy.show(); 之后未显示所有摆动元素(按钮等);方法被调用。我的游戏充满了按钮、表格和其他垃圾,我真的不想自己编写所有这些代码。我也很喜欢 Java 的布局,并希望在此基础上制作所有的 GUI。 所以,这是一个小代码示例,不是来自我的游戏,但它很好地展示了我的问题。谢谢。 顺便说一句,我了解我的问题的根源。我知道挥杆抽签机制是基于事件的,而使用缓冲策略不是基于事件的。但我不知道如何解决这个问题。谢谢你。 最后——我不想使用默认的基于摇摆事件的方法,因为它对游戏来说很慢,而且据我所知,bufferstratgey 只是游戏的方法。谢谢。

public static void main(String[] args){
    final JFrame frame = new JFrame();
    JPanel menuPanel = new JPanel();
    final Button button = new Button("Exit");
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });
    menuPanel.add(button);
    frame.add(menuPanel);
    frame.setPreferredSize(new DimensionUIResource(800, 600));

    //frame.setResizable(false);
    //frame.setUndecorated(true);
    //frame.setIgnoreRepaint(true);

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            final long delay = 1000/60;
            frame.pack();
            frame.setVisible(true);
            final GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
            if (device.isFullScreenSupported()){
                device.setFullScreenWindow(frame);
                // this place. If I turn into fullscreen mode button disappear. And if I stay in windowed mode button exist and work;
            }
            frame.createBufferStrategy(2);
            final BufferStrategy bufferStrategy = frame.getBufferStrategy();

            Thread renderingThread = new Thread(){
                public void run(){
                    while (true){
                        long startRenderingTime = System.currentTimeMillis();
                        Graphics g = bufferStrategy.getDrawGraphics();
                        g.setColor(Color.white);
                        g.fillRect(0,0,1680,1050);
                        //button.paint(g);
                        //button.paintAll(g);
                        // I don't know how to draw button!
                        g.dispose();
                        if (!bufferStrategy.contentsLost()){
                            bufferStrategy.show();
                        }
                        long endRenderingTime = System.currentTimeMillis();
                        long actionTime = endRenderingTime-startRenderingTime;
                        try {
                            if (actionTime>delay){
                                sleep(5);
                            } else {
                                sleep(delay-actionTime);
                            }
                        } catch (InterruptedException e){
                            return;
                        }
                    }
                }
            };
            renderingThread.start();
        }
    });
}

【问题讨论】:

    标签: java swing button graphics bufferstrategy


    【解决方案1】:

    你在 Swings EDT 上运行一个无限循环,有效地阻止了 Swing 做任何事情。

    当您想要显示 Swing 元素时,我什至看不到您需要 BufferStrategy 什么。要将自定义渲染与 Swing 组件结合起来,您通常只需创建一个渲染您的内容并将其添加到正常布局的组件。

    您的组件只是覆盖paintComponent() 并绘制它需要的任何东西。您可以通过调用 repaint() 轻松触发组件的更新。这通常表现得足够好。请注意,Swing 组件默认是双缓冲的,因此无需在此处使用 BufferStrategy。

    如果你想坚持主动渲染,你可以有选择地调用 Swings 渲染链,例如你可以获取 Frame 的 ContentPane 并在你的渲染循环中调用 paint()。但是以这种方式破解它可能会导致不必要的副作用。

    【讨论】:

    • 好的,我在 edt 上看到了这个循环。对不起,这是我在演示代码中的错误。在我的主程序中,我使用“线程渲染线程”来执行这个无限循环。我想使用 BufferStrategy 因为我想以全屏模式运行我的游戏。顺便说一句,常见的 AWT 元素(按钮)在窗口模式下工作正常,但是当我进入全屏模式时,它们都消失了
    • 你不应该将 AWT 组件与 Swing 轻易混合:oracle.com/technetwork/articles/java/…
    • 好的。但是我应该如何处理 JButton?即使在窗口模式下,JButton 也不会显示。顺便说一句,它不会显示,但是如果我点击它应该在的地方,它就可以工作!
    • 看起来我找到了解决方案。我应该这样做:frame.paintComponents(g);在我的渲染循环中。它与 JButton 一起工作正常。
    猜你喜欢
    • 2013-10-14
    • 2013-04-03
    • 2016-04-06
    • 2014-09-19
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多