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();
}
}
The size of a JPanel is not valid until validate() has been called, typically as a result invoking pack() on the containing Window.
ReplyDeleteThe 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.
JPanel is double buffered by default; no further effort is required. AnimationTest is an example.