Eclipse "Widget está dispuesto" Error

tdog:

Muy bien, así que estoy usando Eclipse oxígeno aquí (creo que eso es importante, ya que parece que esto es un error generado en Eclipse). He visto varios otros puestos en este error específico, pero ninguno de ellos trabajó para mí / no eran cosas que ya había probado. Así que mi objetivo es tener un tiempo de bucle y tienen que obtener el nivel de sonido dB cada segundo y actualizar una etiqueta.

Por desgracia, eso no funcionó como 5 veces en una fila. La primera, la ventana no se abrió, y se dio cuenta de que era porque el bucle while mantenía la ventana de apertura, por lo que poner en un hilo. Y entonces, como 5 intentos de arreglar más tarde, todavía estoy recibiendo un error "Widget está dispuesto" en mi código. Aquí está el código para abrir la ventana (que es el único código que he cambiado desde que hice el proyecto):

public void open() throws InterruptedException, LineUnavailableException {
    Display display = Display.getDefault();
    shlAudioAdjuster = new Shell();
    shlAudioAdjuster.setSize(450, 300);
    shlAudioAdjuster.setText("Audio Adjuster");

    Label lblCurrentDecibelLevel = new Label(shlAudioAdjuster, SWT.NONE);
    lblCurrentDecibelLevel.setFont(SWTResourceManager.getFont("Muli", 14, SWT.NORMAL));

    ProgressBar progressBar = new ProgressBar(shlAudioAdjuster, SWT.NONE);
    progressBar.setSelection(30);
    progressBar.setBounds(143, 168, 170, 17);
    shlAudioAdjuster.open();
    shlAudioAdjuster.layout();
    while (!shlAudioAdjuster.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    AudioFormat audioFormat = getAudioFormat();
    TargetDataLine targetDataLine;
    try {
        targetDataLine = (TargetDataLine) AudioSystem.getTargetDataLine(audioFormat);
        targetDataLine.open();
        targetDataLine.start();
        byte [] buffer = new byte[2000];
        while (true) {
            int bytesRead = targetDataLine.read(buffer,0,buffer.length);
             int max;
             if (bytesRead >=0) {
                 max = (short) (buffer[0] + (buffer[1] << 8));
                 for (int p=2;p<bytesRead-1;p+=2) {
                     short thisValue = (short) (buffer[p] + (buffer[p+1] << 8));
                     if (thisValue>max) max=thisValue;
                 }
                 progressBar.setSelection((int)(20 * Math.log10(max)));
             }
        }
    } catch (LineUnavailableException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Y confirma el error que hay un problema con progressBar.setSelection((int)(20 * Math.log10(max)));. Aquí está el error completo:

org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(SWT.java:4533)
    at org.eclipse.swt.SWT.error(SWT.java:4448)
    at org.eclipse.swt.SWT.error(SWT.java:4419)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:482)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:354)
    at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:322)
    at MainWindow.open(MainWindow.java:90)
    at MainWindow.main(MainWindow.java:34)

PD: La última línea de error que dice 34 es la persona que llama para esa función, la primera es la línea barra de cambio de marcha. ¿Algunas ideas?

Greg-449:

La ventana de Shell sólo se muestra mientras que el while (!shlAudioAdjuster.isDisposed())bucle se está ejecutando. Una vez que bucle ha salido de todos los controles en la carcasa están dispuestos y no se pueden usar más. Por lo que no puede poner su código después de que el bucle while.

Usted tendrá que poner el código de la reproducción del sonido en un hilo separado que se inicia cuando se abre la cubierta. Pero no se puede actualizar la barra de progreso directamente en un subproceso de fondo, en lugar usted necesita utilizar Display.asyncExecpara ejecutar la actualización barra de progreso en el hilo de interfaz de usuario:

Display.getDefault().asyncExec(() -> progressBar.setSelection((int)(20 * Math.log10(max))));

También puede ser que desee comprobar si la barra de progreso ha sido dispuesto y detener el hilo:

if (progressBar.isDisposed()) {
  // TODO exit the thread
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=214059&siteId=1
Recomendado
Clasificación