4

This is my first attempt at using BufferStrategy and I'd really appreciate some hints.

1) Why, in the below code, does getSize() return dimensions of 0 until you have resized the window? How can I detect the size of the window right away?

2) Why when getSize() is returning something is it not the full dimensions of the window? IE why is there a blackless strip to the bottom and right?

3) Is there a way to get rid of the flicker when you resize the window?

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BSTest extends JFrame {
    BufferStrategy bs;
    DrawPanel panel = new DrawPanel();

    public BSTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,420);
        setLocationRelativeTo(null);
        setIgnoreRepaint(true);
        setVisible(true);
        createBufferStrategy(2);
        bs = getBufferStrategy();
        panel.setIgnoreRepaint(true);
        add(panel);
        panel.drawStuff();
    }

    public class DrawPanel extends JPanel {
        public void drawStuff() {
            while(true) {
                try {
                    Graphics2D g = (Graphics2D)bs.getDrawGraphics();
                    g.setColor(Color.BLACK);
                    System.out.println("W:"+getSize().width+", H:"+getSize().height);
                    g.fillRect(0,0,getSize().width,getSize().height);
                    bs.show();
                    g.dispose();
                    Thread.sleep(20);
                } catch (Exception e) { System.exit(0); }
            }
        }
     }

    public static void main(String[] args) {
        BSTest bst = new BSTest();
    }
}
flea whale
  • 1,783
  • 3
  • 25
  • 38

1 Answers1

5
  1. The size of a JPanel is not valid until validate() has been called, typically as a result invoking pack() on the containing Window.

  2. The final size is the result of a combination of factors including the preferred sizes of the enclosed components and the panels UI delegate for a particular Look & Feel.

  3. JPanel is double buffered by default; no further effort is required. AnimationTest is an example.

Community
  • 1
  • 1
trashgod
  • 203,806
  • 29
  • 246
  • 1,045
  • Wow dude, this example solves all my problems, thanks! One question: is this method really as resource-friendly as using the `BufferStrategy` method, where you draw stuff and then do bs.show()? I mean, is it getting the graphics card to do all the hard work? – flea whale Feb 25 '12 at 06:58
  • Good question: it operates at a slightly higher level of abstraction that uses the host platform's best effort. Note that all `JComponent` subclasses inherit the buffer strategies of `Component`. – trashgod Feb 25 '12 at 07:20
  • 2
    @flea whale I have some another most important issues, 1) bs.getDrawGraphics(); is only snapshot and every painting is killed by code line Thread.sleep(int);, use Swing Timer instead +1 – mKorbel Feb 25 '12 at 08:16