Bufferstrategy not showing on java.awt.Frame

落花浮王杯 提交于 2019-11-29 17:29:53

So, two things jump out, one, getBufferStrategy will return the next buffer to be used, so you are changing properties on different buffers.

Two, there is a race condition between you drawing on the buffer and the window been painted again by the native peer, overwriting your buffer's contents.

This example basically sets up a infinite update loop which repaints the buffer, you can slow down the delay and you can see it change from one state to another

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.setTitle("AstroCycles | By: Carlos Aviles");
        frame.setLocationRelativeTo(null);
        frame.setFocusable(true);
        frame.setSize(100, 100);
        frame.setBackground(Color.BLUE);
        frame.setVisible(true);
        frame.createBufferStrategy(3);

        do {
            BufferStrategy bs = frame.getBufferStrategy();
            while (bs == null) {
                System.out.println("buffer");
                bs = frame.getBufferStrategy();
            }
            do {
                // The following loop ensures that the contents of the drawing buffer
                // are consistent in case the underlying surface was recreated
                do {
                    // Get a new graphics context every time through the loop
                    // to make sure the strategy is validated
                    System.out.println("draw");
                    Graphics graphics = bs.getDrawGraphics();

                    // Render to graphics
                    // ...
                    graphics.setColor(Color.RED);
                    graphics.fillRect(0, 0, 100, 100);
                    // Dispose the graphics
                    graphics.dispose();

                    // Repeat the rendering if the drawing buffer contents
                    // were restored
                } while (bs.contentsRestored());

                System.out.println("show");
                // Display the buffer
                bs.show();

                // Repeat the rendering if the drawing buffer was lost
            } while (bs.contentsLost());
            System.out.println("done");
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        } while (true);
    }

}

A better solution would be to use a Canvas and add this to the frame and use it's BufferStrategy, this will prevent you from painting under the frame's borders and provide you with a better idea of the actual viewable space you can paint

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!