【问题标题】:Why is getSize() not working for me here and why the flicker when resizing?为什么 getSize() 在这里对我不起作用,为什么在调整大小时会闪烁?
【发布时间】:2012-03-15 12:39:41
【问题描述】:

这是我第一次尝试使用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();
    }
}

【问题讨论】:

    标签: java swing doublebuffered


    【解决方案1】:
    1. JPanel 的大小在调用 validate() 之前无效,通常是因为在包含 Window 上调用 pack()

    2. 最终尺寸是综合因素的结果,包括封闭组件的首选尺寸和特定外观的面板 UI 委托。

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

    【讨论】:

    • 哇老兄,这个例子解决了我所有的问题,谢谢!一个问题:这种方法真的像使用BufferStrategy 方法一样资源友好吗?我的意思是,它是让显卡完成所有艰苦的工作吗?
    • 好问题:它在稍微更高的抽象级别上运行,使用主机平台的最大努力。注意所有JComponent子类都继承Component的缓冲策略。
    • @flea whale 我还有一些最重要的问题,1) bs.getDrawGraphics();只是快照,每幅画都被代码行 Thread.sleep(int); 杀死,改用 Swing Timer +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2013-05-16
    • 2019-02-10
    相关资源
    最近更新 更多