Буферы не были созданы во время создания буферов

У меня есть (как я думал) простая BufferStrategy для 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)

person Will Hamilton    schedule 08.08.2010    source источник
comment
Пожалуйста, добавьте к вашему вопросу полную трассировку стека - это должно помочь узнать, какой метод создает ISE. Я просмотрел источники jre (1.7), но не смог найти потенциальный источник для этого исключения.   -  person Andreas Dolk    schedule 09.08.2010
comment
Это действительно полная трассировка стека? Мы ищем доказательства того, что вы звоните из EDT. Продолжайте и покажите полную трассировку стека.   -  person Kevin Day    schedule 09.08.2010
comment
@Kevin Day, Exception in thread "main" предполагает, что это не из EDT.   -  person finnw    schedule 09.08.2010
comment
@finw - согласен, поэтому я хочу увидеть полную трассировку стека, чтобы мы могли сказать ему, откуда он вызывается. Я искренне надеюсь, что все эти запросы на трассировку стека дадут ОП некоторые идеи о том, как устранять неполадки такого рода.   -  person Kevin Day    schedule 11.08.2010
comment
Мои извинения - то, что я добавил в свой пост, не является полной трассировкой стека? Это то, что я получаю в окне консоли моей IDE. Должен ли я специально кодировать вызов для сброса трассировки стека?   -  person Will Hamilton    schedule 15.08.2010


Ответы (2)


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

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

class MyFrame extends JFrame {
    public void addNotify() {
        super.addNotify();
        // Buffer
        createBufferStrategy(2);           
        strategy = getBufferStrategy();
    }
}
person finnw    schedule 09.08.2010

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

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

person camickr    schedule 08.08.2010
comment
Я предпочитаю обновлять графику вручную, поэтому наличие доступа к реальному объекту BufferStrategy делает это довольно просто — нарисовать множество элементов на графике, а затем просто вызвать Strategy.show(), как только я закончу. Поправьте меня, если это ужасный способ сделать что-то! Я обязательно почитаю немного больше о Concurrency. - person Will Hamilton; 09.08.2010
comment
Я думал, что мое предложение показало мое мнение об использовании BufferedStrategy, которое, как я считаю, могло быть полезным при использовании AWT, но, как я уже упоминал, Swing отличается. В учебнике также есть раздел Custom Painting, на который стоит обратить внимание. - person camickr; 09.08.2010