我不断收到以下错误消息 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/