为什么getSize()在这里不能为我工作?为什么在调整大小时闪烁?

fle*_*ale 4 java swing doublebuffered

这是我第一次尝试使用BufferStrategy,我真的很感激一些提示.

1)为什么在下面的代码中,getSize()在调整窗口大小之前返回0的尺寸?如何立即检测窗口的大小?

2)为什么什么时候getSize()返回的东西不是窗户的全尺寸?IE为什么底部和右边都有一条黑色条带?

3)调整窗口大小时有没有办法摆脱闪烁?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

tra*_*god 5

  1. a的大小在被调用JPanel之前是无效的validate(),通常作为调用pack()包含的结果Window.

  2. 最终尺寸是多种因素组合的结果,包括封闭组件的首选尺寸和特定外观的面板UI代表.

  3. JPanel默认为双缓冲; 无需进一步努力.AnimationTest就是一个例子.

  • @flea whale我还有另外一些最重要的问题,1)bs.getDrawGraphics(); 只是快照,每个绘画都被代码行Thread.sleep(int);杀死,使用Swing Timer代替+1 (2认同)