Я продолжаю получать следующее сообщение об ошибке java.lang.IllegalStateException: буферы не созданы

Я продолжаю получать следующее сообщение об ошибке java.lang.IllegalStateException: Буферы не созданы. Я впервые сталкиваюсь с этим и не знаю, как безопасно от него избавиться. Я исследовал это сообщение об ошибке, и единственным решением, с которым я столкнулся, было использование следующего:

создатьBufferStrategy(2);

Насколько я понимаю, Java по умолчанию использует двойную буферизацию, и мне не нужна строка выше. (Кстати, я вообще не возился с буферами до ошибки). Некоторые говорят, что это сообщение может отображаться, если вы рендерите что-то за пределами EDT.

Ниже приведен пример кода, который я написал, чтобы продемонстрировать, что делает мое приложение. Во-первых, приложение написано на платформе NetBeans (RCP). Класс BarcodeInput получает данные, поступающие через сканер штрих-кода, подключенный к последовательному порту, после чего рабочий процесс BarcodeProcessWorker обрабатывает эти данные дальше. Код, показанный ниже, отлично работает, не выдавая мне сообщений об ошибках, но если я использую SwingUtilities.invokeLater, я получаю сообщение об ошибке. Для меня это не имеет никакого смысла, поскольку я думал, что буду использовать SwingUtilities.invokeLater из фонового потока для обновления графического интерфейса, поскольку все обновления должны выполняться в EDT.

    public final class MainTopComponent extends TopComponent {//NetBeans TopComponent

        public MainTopComponent() {        
            initComponents();//The MainJPanel is created here
            ...
        }

    }

    public class MainJPanel extends javax.swing.JPanel{

        private SerialPortConnection spc;

        public MainJPanel() {
            initComponents();//Paints GUI components
            initSerialPortConnection();//Initialize the Serial Port (SerialPortConnection spc) for the Barcode Scanner
            initBarcode();
        }

        private void initBarcode(){
            BarcodeInput bsi = new BarcodeInput(bspc);
        }

    }

    public class BarcodeInput implements BarcodeSerialPortListener{

        private BarcodeSerialPortConnection bspc;
        private BarcodeJDialog barcodeJDialog;

        public BarcodeInput(BarcodeSerialPortConnection bspc) {
            this.bspc = bspc;
            barcodeJDialog = new barcodeJDialog();//This is just a regular JDialog with some labels displayed and among them is a label called labelBarcode
        }

        public void addToBarcodeSerialPortListenerList() {
            bspc.addToBarcodeSerialPortListenerList(this);
        }

        public boolean isBarcodeJDialogVisible(){
            return barcodeJDialog.isVisible();
        }

        public void showBarcodeJDialog(){
            barcodeJDialog.setVisible(true);
        }

        public void hideBarcodeJDialog(){
            barcodeJDialog.setVisible(false);
        }

        public void setTextOfLabelBarcode(String s){
            barcodeJDialog.setTextOfLabelBarcode(s);
        }

        @Override
        public void stringReveivedFromSerialPort(String serialPortString) {//Overrides the method in the interface BarcodeSerialPortListener
            BarcodeProcessWorker bpWorker = new BarcodeProcessWorker(this, serialPortString);
            bpWorker.execute();//This swing worker class processes the received serial port string
        }

    }


public class BarcodeProcessWorker extends SwingWorker<Void,Void>{

    private BarcodeInput bi;
    private String serialPortString;

    public BarcodeProcessWorker(BarcodeInput bi, String serialPortString){
        this.bi = bi;
        this.serialPortString = serialPortString;
    }

    @Override
    protected Void doInBackground() throws Exception{

        if("SHOW".contains(serialPortString)){

        //First I remove the SHOW from the serialPortString and whatever is left is the data:
        //For example if the barcode had SHOW12345, I end up with 12345 as data. SHOW is just a command
        //that tells my application to display the BarcodeJDialog, where HIDE tells it to hide the BarcodeJDialog.

            ShowBarcode sb = new ShowBarcode(bi, barcodeData);
            sb.show();

        }else if("HIDE".equals(serialPortString){

            bi.hideBarcodeJDialog();//WORKS LIKE THIS, DOES NOT WORK AS SHOWN BELOW

            //If I use the following here, I get that error message
            //  SwingUtilities.invokeLater(new Runnable(){
            //      @Override
            //      public void run(){
            //          bi.hideBarcodeJDialog();
            //      }
            //  });

        }

        return null;
    }

}

public class ShowBarcode {

    private BarcodeInput bi;
    private String barcodeData;

    public ShowBarcode(BarcodeInput bi, String barcodeData){
        this.bi = bi;
        this.barcodeData = barcodeData;
    }

    public void show(){

        bi.setTextOfLabelBarcode(barcodeData);//Set text as 12345
        bi.showBarcodeJDialog();//WORKS LIKE THIS, DOES NOT WORK AS SHOWN BELOW

        //If I use the following here, I get that error message
        //  SwingUtilities.invokeLater(new Runnable(){
        //      @Override
        //      public void run(){
        //      bi.setTextOfLabelBarcode(barcodeData);//Set text as 12345
        //      bi.showBarcodeJDialog();
        //      }
        //  });

    }

}

person jadrijan    schedule 12.09.2012    source источник
comment
Рассмотрите возможность сокращения кода для создания SSCCE.   -  person Guillaume Polet    schedule 12.09.2012


Ответы (1)


Я подумал, что мне следует использовать SwingUtilities.invokeLater() из фонового потока для обновления графического интерфейса, поскольку все обновления должны выполняться в EDT.

Нет, doInBackground() обычно вызывает один или оба из двух приведенных ниже методов, как показано в этом примере:

  • publish(): опубликованные значения должны обрабатываться process(), работающим в EDT.

  • setProgress(): новые значения передаются по EDT всем зарегистрированным PropertyChangeListener.

Без веской причины для изменения я бы просто использовал стратегию буфера JComponent по умолчанию.

person trashgod    schedule 12.09.2012