java - 我不断收到以下错误消息 java.lang.IllegalStateException : Buffers have not been created

标签 java swing exception swingworker netbeans-platform

我不断收到以下错误消息 java.lang.IllegalStateException:尚未创建缓冲区。 这是我第一次遇到这种情况,不知道如何安全地摆脱它。 我研究了这个错误消息,我遇到的唯一解决方案是使用以下内容:

createBufferStrategy(2);

根据我的理解,Java 默认是双缓冲的,我不需要上面的行。 (顺便说一句,我根本没有弄乱缓冲区 发生错误之前)。有人说,如果您在 EDT 之外渲染某些内容,则可能会显示此消息。

以下只是我编写的示例代码,用于演示我的应用程序的功能。首先,应用程序是在NetBeans平台上编写的 (RCP)。 BarcodeInput 类接收通过连接到串行端口的条码扫描仪传入的数据,然后由工作器 BarcodeProcessWorker 进一步处理该数据。下面显示的代码的方式工作得很好,没有给我错误消息,但如果我使用 SwingUtilities.invokeLater 我会收到错误消息。 这对我来说没有任何意义,因为我认为我应该从后台线程使用 SwingUtilities.invokeLater 来更新 GUI,因为所有更新都应该在 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();
        //      }
        //  });

    }

}

最佳答案

I thought that I sould be using the SwingUtilities.invokeLater() from a background thread to updated the GUI, as all updates should be performed on the EDT.

不,doInBackground() 通常会调用下面两个方法中的一个或两个,如 example 所示。 :

  • publish():发布的值应由在 EDT 上运行的 process() 处理。

  • setProgress():新值在 EDT 上传递给任何已注册的 PropertyChangeListener

如果没有令人信服的理由进行更改,我只会使用默认的 JComponent 缓冲区策略。

关于java - 我不断收到以下错误消息 java.lang.IllegalStateException : Buffers have not been created,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390457/

相关文章:

java - setIconImage() 的问题

java - Swing JFrame 导致 JavaFX 应用程序在 OS X 上崩溃

java - 为什么 IllegalArgumentException (JDK 1.4.2) 不能用可抛出的原因构造?

java - 无法进入jsp文件中的if语句

java - 获取 AsyncTask 的返回值并使用它?

java - 转换日期: d-M-yyyy to dd-MM-yyyy

java - java可以通过在同一行上覆盖时间来在命令行上做一个计时器吗?

java - 用java实现书签列表

c# - 任务中抛出的异常只有在代码经过优化后才会得到处理

java.lang.ClassCastException : java. lang.String 无法转换为 java.util.Map