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

标签 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();
    }
}

最佳答案

  1. 在调用 validate() 之前,JPanel 的大小是无效的,通常是调用 pack() 在包含 Window 上。

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

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

关于java - 为什么 getSize() 在这里对我不起作用,为什么调整大小时会闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9441328/

相关文章:

java - 按对象的两个字段排序。 java

循环中的 javax.swing.JFrame setText()? + 故意拖延?

c# - 可滚动图片框c#.net使用双缓冲停止闪烁

java - 添加 SOAP 故障而不更改 WSDL 文件?

java - java 中的 netlogo

java - 如果两个线程使用不同的监视器,它们是否可以在同一个对象上执行相同的同步代码块?

java - 从面板顶部留出间隙

Java 日志文件创建多个副本

java - 在Java中添加canvas后无法关闭窗口

java - Swing/JFrame 与 AWT/Frame 在 EDT 之外的渲染