«Буферы не были созданы» ... при создании буферов - PullRequest
5 голосов
/ 09 августа 2010

У меня есть (как я думал, было) стратегия Buffer для JFrame. Он создан так:

    // Buffer
    container.createBufferStrategy(2);           
    strategy = container.getBufferStrategy();

Тем не менее, иногда я получаю следующую ошибку (которая указывает на первую строку предыдущего фрагмента в качестве элемента-нарушителя):

java.lang.IllegalStateException: буферы не были созданы

Эта ошибка является особенной, когда она появляется и уходит - иногда она срабатывает, иногда нет. Я подозреваю это означает, что это проблема с многопоточностью. У кого-нибудь есть указания относительно того, что здесь может происходить? Я немного растерялся, потому что я уже пытаюсь делать то, что Java говорит, что хочет, чтобы я делал!

редактировать: полный след:

Exception in thread "main" java.lang.IllegalStateException: Buffers have not been created
        at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:877)
        at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815)
        at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800)
        at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791)
        at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3730)
        at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4253)
        at java.awt.Component.createBufferStrategy(Component.java:3612)
        at java.awt.Window.createBufferStrategy(Window.java:3015)
        at java.awt.Component.createBufferStrategy(Component.java:3536)
        at java.awt.Window.createBufferStrategy(Window.java:2990)

Ответы [ 2 ]

3 голосов
/ 09 августа 2010

Кадр должен отображаться при вызове createBufferStrategy.Также, как указал camickr, вам нужно вызывать его из EDT.

Один из способов обеспечить это - расширить JFrame и переопределить addNotify:

class MyFrame extends JFrame {
    public void addNotify() {
        super.addNotify();
        // Buffer
        createBufferStrategy(2);           
        strategy = getBufferStrategy();
    }
}
1 голос
/ 09 августа 2010

Компоненты Swing по умолчанию имеют двойную буферизацию, поэтому нет необходимости работать с BufferStrategy.

Однако, когда вы получаете случайные ошибки, подобные этой, обычно потому, что код не выполняется в EDT. Прочитайте раздел из учебника по Swing на Concurrency для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...