Почему getSize () у меня не работает и почему мерцание при изменении размера? - PullRequest
4 голосов
/ 25 февраля 2012

Это моя первая попытка использования 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 голосов
/ 25 февраля 2012
  1. Размер JPanel недействителен до тех пор, пока не будет вызван validate(), обычно в результате вызывается pack() на содержащем Window.

  2. Окончательный размер является результатом сочетания факторов, включая предпочтительные размеры вложенных компонентов и делегирования пользовательского интерфейса панелей для определенного внешнего вида.

  3. JPanelпо умолчанию двойная буферизация;никаких дополнительных усилий не требуется.AnimationTest является примером.

...