为什么在这里getSize()不起作用,调整大小时为什么会闪烁?

4
这是我第一次尝试使用BufferStrategy,我希望能得到一些提示。
1)为什么在下面的代码中,getSize()在调整窗口大小之前返回0的尺寸?如何立即检测窗口的大小?
2)为什么当getSize()返回值时,它不是窗口的完整尺寸?也就是说,为什么底部和右侧有一个黑色条纹?
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();
    }
}
1个回答

5
  1. 在调用包含Windowpack()方法后,必须调用validate()方法才能使JPanel的大小有效。

  2. 最终大小是多种因素的综合结果,包括所包含组件的首选大小以及特定外观和感觉下JPanel的UI代理。

  3. JPanel默认情况下是双缓冲的;无需进一步操作。 AnimationTest是一个例子。


哇,老兄,这个例子解决了我所有的问题,谢谢!有一个问题:这种方法真的像使用“BufferStrategy”方法那样资源友好吗?也就是说,它是否让显卡来完成所有的重活? - flea whale
好问题:它在稍微更高的抽象层上运行,使用主机平台的最佳努力。请注意,所有JComponent子类都继承了Component的缓冲策略。 - trashgod
2
@flea whale 我还有一些更重要的问题,1)bs.getDrawGraphics(); 只是快照,每次绘制都会被代码行 Thread.sleep(int); 杀死,建议使用 Swing Timer 替代 +1 - mKorbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接