Pregunta

(Java SE 6) Estoy tratando de crear un cuadro de diálogo emergente que muestre un mensaje de "por favor espera" mientras mi programa realiza algo de trabajo intensivo en el tiempo. Para hacer esto, he optado por usar un JDialog Modish, para que el programa continúe ejecutándose y funcione mientras el JDialog es visible (si usa uno modal, el programa se detendrá hasta que el usuario cierre el diálogo) .

El problema es que cuando usa un diálogo sin modificación de esta manera, aparece el JDialog con un título, pero el contenido no (supongo que no son pintados por alguna razón). He intentado llamar a la repinte, etc. pero nada parece funcionar.

Ahora, según un grupo de personas en las interwebs, este es un error genuino con Swing, y las únicas respuestas que he encontrado son no hacer las cosas de esta manera y encontrar otros medios para notificar al usuario que espere. Tengo curiosidad por saber si alguien aquí ha tenido este problema antes y ha descubierto una solución al trabajo.

¡Gracias!

¿Fue útil?

Solución

Como alternativa, considere usar SwingWorker y mostrando un progreso interino, como se sugiere en este ejemplo.

Otros consejos

No es un error, debe ejecutar su trabajo de peso pesado y su trabajo de swing de peso ligero en el hilo Seped junto al hilo principal. Es necesario debido a las inflicciones lógicas entre el hilo de la GUI de diálogo y es la relación de acción de acción con el trabajo de Weigth pesado en el respaldo. Si no se separa, su hilo principal deterará el swing debido a algunos eventos de notificación. Tuve el mismo problema, intenté monitorear el progreso de un progreso de carga FTP que comencé de un Jframe para mostrarlo en un JDialog.

Primero intenté:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
            /*Run JDialog with the Upload - ProgressBar*/
            FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
        }
    }.start();

/*Run the heavy weigth Job - the Upload*/
ftpPersistence.uploadFile(localFile, remoteFile);

// ...
    }

//...

}

Pero de esta manera me reengo un jdialog frameborder y un panel de contenido de Balck pero ...

A continuación, intente:

//Activated by Upload Button
public void actionPerformed(ActionEvent e) {

    if("Upload".equals(e.getActionCommand())){

    // some Declarations

    new Thread(){

        public void run() {
        /*Run JDialog with the Upload - ProgressBar*/
        FileUploadProgressBar fileUploadProgressBar = new FileUploadProgressBar(localFile, remoteFile, ftpPersistence);
    }
}.start();


new Thread(){

    public void run() 
            /*Run the heavy weigth Job - the Upload*/
            ftpPersistence.uploadFile(localFile, remoteFile);
        }
    }.start();
    // ... 
    }
//...
}

Y finalmente funcionó, espero que ayude;)

Estoy usando esto y funciona: el código original (sin la solución que encontré para volver a pintar a medida que se ejecuta) es de aquí:http://inversionConsulting.blogspot.com/2008/03/java-jdialog-and-jprogressbar-example.html

Pero lo consolidé (con ligeros cambios):

JProgressBar pb = new JProgressBar(0,100);

pb.setPreferredSize(new Dimension(275,30));
pb.setString("Running");
pb.setStringPainted(true);
pb.setValue(0);

JLabel label = new JLabel("Progress: ");
JPanel center_panel = new JPanel();

center_panel.add(label);
center_panel.add(pb);

JDialog dialog = new JDialog((JFrame)null, "Working ...");

dialog.getContentPane().add(center_panel, BorderLayout.CENTER);
dialog.pack();
dialog.setVisible(true);
dialog.setLocationRelativeTo(null); // center on screen

En mi código más adelante, cuando se ejecuta a través de mi bucle (siendo de 1 a 10 usando la variable 'Tot'), vuelvo a pintar el cuadro de diálogo, actualizando la barra de progreso a medida que el programa se ejecuta a través del bucle, por lo tanto (esto no se da en el Enlace de página anterior) (no estoy usando múltiples hilos, todo esto está en el hilo principal):

//set progress bar
pb.setValue(tot*10);
//repaint it
dialog.getContentPane().paintAll(pb.getGraphics());

Tomó mucho tiempo, prueba y error para encontrar esta solución. Espero que funcione para ti como lo hace para mí.

Has probado validar() (es necesario después de agregar componentes a un contenedor)? También considere publicar el código fuente, para que podamos verificarlo. Buena suerte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top