gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:32:59 24 4
gpt4 key购买 nike

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

创建缓冲区策略(2);

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

以下只是我编写的示例代码,用于演示我的应用程序的功能。首先,应用程序是在 NetBeans 平台上编写的(RCP)。 BarcodeInput 类接收通过连接到串行端口的 Barcode Scanner 传入的数据,然后 Worker 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com