Refrescar un jframe

Hola buenas tardes compañeros les comento:

Es un problema que ya llevo dos días y la verdad no puedo resolver espero me puedan ayudar.

Estoy realizando una aplicación que lee un archivo de texto bastante grande pero quiero agregar un JProgressBar para mostrarle al usuario cuanto tiempo tarda en procesar el archivo pero no logro mostrarlo de la manera correcta.

Mando a llamar desde el botón de la ventana principal a la clase donde tengo programado JProgressBar

//codigo del boton de la ventana principal
private void btn_SalActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:          
            this.setVisible(false);
            BarraDeProceso frame = new BarraDeProceso();
            frame.ini();
    }

para que se ejecute un proceso donde mando a llamar jframe que muestra la barra de proceso pero no puedo mostrarlo de la manera correcta por que cuando lo mando a llamar si se muestra pero mal masta que termina el proceso while se muestra de la manera correcta no se porque este es el codigo de BarraDeProceso();

public class BarraDeProceso extends JFrame{
   
    JProgressBar current;
   
    public BarraDeProceso() {
        super("Progress");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout());
        current = new JProgressBar(0, 100);
        current.setValue(0);
        current.setStringPainted(true);
        pane.add(current);
        setContentPane(pane);
    }

    public void iterate() {
        int num = 0;
        while (num <= 100) {
            current.setValue(num);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            num += 50;
        }
    }

    public void ini() {
        BarraDeProceso frame = new BarraDeProceso();
        frame.pack();
        frame.setVisible(true);
        frame.setBounds(0, 0, 400, 400);
        frame.setLocationRelativeTo(null);
        frame.iterate();
    }

//    public static void main(String[] arguments) {
//        BarraDeProceso frame = new BarraDeProceso();
//        frame.ini();
//    }
//    
}

y lo mas raro es que lo ejecuto desde public static void main(String[] arguments) y se ejecuta de manera correcta no se que pase.

adjunto unas imagenes haber de que pueden ayudar

.NOTA : lo que comento es que cuando esta en proceso while me muestra la imagen "error"  cuando termina el proceso while me muestra la imagen "correcto"  no se a que se deva pero lo ejecuto desde un main y se ejecuta de manera correcta el problema solo lo tengo desde el boton "btn"de la pantalla principal. .

AdjuntoTamaño
btn.png1.28 KB
correcto.png5.39 KB
error.png5.05 KB

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

swingworker

Nunca bloquees el thread de eventos de swing. Tienes que hacer el trabajo en un thread aparte y sincronizar periódicamente con el thread de eventos de swing para actualizar la barra de progreso.

Revisa la clase SwingWorker, ahí vienen ejemplos de tareas largas que actualizan una barra de progreso periódicamente.

seguimiento de swingworker

Buenas tardes ezamudio te comento:

Ya revise la clase que me comentas swingworker ya la implemente pero sigo sin poder ejecutar como ami me gustaría el problema es el siguiente.

crea esta clase con la con la ayuda de swingworker

public class ProgressBar extends JPanel implements PropertyChangeListener {

    private JProgressBar progressBar;

    private Task task;
    int numero;
    JFrame frame = new JFrame();
    public ProgressBarDemo(int nu) {
        super(new BorderLayout());

        numero = nu;
        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setStringPainted(true);

        JPanel panel = new JPanel();
        panel.add(progressBar);
        add(panel, BorderLayout.PAGE_START);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        task = new Task();
        task.addPropertyChangeListener(this);
        task.execute();

    }
   
        class Task extends SwingWorker<Void, Void> {

        /*
     * Main task. Executed in background thread.
         */

        @Override
        public Void doInBackground() {
            Random random = new Random();
            int progress = 0;
            setProgress(0);
            while (progress < 100) {
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException ignore) {
                }
                progress += random.nextInt(numero);
                setProgress(Math.min(progress, 100));
            }
//            frame.dispose();
            return null;
        }
        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            setCursor(null); // turn off the wait cursor
        }
    }

    /**
     * Invoked when task's progress property changes.
     */

    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress" == evt.getPropertyName()) {
            int progress = (Integer) evt.getNewValue();
            progressBar.setValue(progress);
        }
    }

    /**
     * Create the GUI and show it. As with all GUI code, this must run on the
     * event-dispatching thread.
     */

    public void createAndShowGUI() {
   
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JComponent newContentPane = new ProgressBarDemo(numero);
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setVisible(true);
//        frame.setLocationRelativeTo(null);
    }
}

con esta clase logro ejecutar la barra de proceso desde un botón que en principio ese era mi problema ahora ya se ejecuta correctamente pero el problema viene cuando hago promero un primer un proceso y despues la llamo hace exactamente lo mismo que hacia cuando no me lo ejecutaba desde el boton AHORA LO QUE HACE ES QUE PRIMERO HACE EL PROCESO Y DESPUES SE EJECUTA AL ULTIMO NO SE QUE PASA DE VERDAD

Desde este boton la mando a llamar pero como te comento antes realizo un proceso que entra a un ciclo for y después lo ejecuta

  private void btn_ProcActionPerformed(java.awt.event.ActionEvent evt) {  

        Ventana ver = new Ventana();
        Reportes ver2 = new Reportes();
        Workbook workbook = null;
        String nombre, nombre2, antesDeMedio, nombreMedio, nombre3, nombre4, nombre5;
        Sheet sheet;
        FileWriter nuevaescritura;
        String n = null;
        ProgressBar ver33 = new ProgressBar(20);//AQUÍ FUNCIONA
        ver33.createAndShowGUI();                        // AQUÍ FUNCIONA
        //se maneja la excepcion de si encuantra el archivo o no
        try {
            workbook = Workbook.getWorkbook(new File(drc)); //Pasamos el excel que vamos a leer    
        sheet = workbook.getSheet(0); //Seleccionamos la hoja que vamos a leer  
        System.out.println("ver " + sheet.getRows());
//        float calculo =   sheet.getRows()/ 25;
//        float calculo2 = 100 / calculo;
//        int total = (int) Math.ceil(calculo2);
//        ProgressBar ver33 = new ProgressBa(20);  //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA
//        ver33.createAndShowGUI();                         //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA

            for (int fila = 4; fila < sheet.getRows() - 2; fila++) { //recorremos las filas
                //leemos las columnas solo  las que necesitamos
                nombre = sheet.getCell(0, fila).getContents() + "|";
                nombre2 = sheet.getCell(1, fila).getContents() + "|";
                antesDeMedio = sheet.getCell(2, fila).getContents() + "|";
                nombreMedio = sheet.getCell(3, fila).getContents() + "|";
                nombre3 = sheet.getCell(5, fila).getContents() + "|";
                nombre4 = sheet.getCell(10, fila).getContents() + "|";
                nombre5 = sheet.getCell(12, fila).getContents() + "|";
//                System.out.print(nombre); // imprimir nombre
                contador++;
                n = nombre + nombre2 + antesDeMedio + nombreMedio + nombre3 + nombre4 + nombre5 + "\r\n";
                System.out.println("————————————- " + contador);
                //trabajamos con la excepcion de si no se puede escribir el archivo de txt
                nuevaescritura = new FileWriter("C:\\12.txt", true);
                for (int e = 0; e < n.length(); e++) {
                    nuevaescritura.write(n.charAt(e));
                }
                // se cierra el archivo
                nuevaescritura.close();
            }

        } catch (IOException ex) {
            Logger.getLogger(RepTim.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "No se puede escribir temp" + ex.getMessage());
        } catch (BiffException ex) {
            Logger.getLogger(Ventana.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "El archivo no se encuentra " + ex.getMessage());
        }

Cual es la intención para que funcione de manera perfecta o como me gustaría que funcionara la JProgressBar o no se se lo puedo utilizar de otra manera pero al menos ami creo que así me funcionaria bien.

  try {
            workbook = Workbook.getWorkbook(new File(drc)); //Pasamos el excel que vamos a leer    
        sheet = workbook.getSheet(0); //Seleccionamos la hoja que vamos a leer  
        System.out.println("ver " + sheet.getRows());//cuanto las filas que tiene el excel y calculo
//        float calculo =   sheet.getRows()/ 25;  //25 porque pon las lineas que escribe por segundo mas o menos
//        float calculo2 = 100 / calculo;//calculo
//        int total = (int) Math.ceil(calculo2);// y ese calculo se lo paso para que el progress vaya creciendo hasta llegar a 100
//        ProgressBar ver33 = new ProgressBa(20);  //AQUÍ YA NO FUNCIONA ENTRA AL CICLO Y DESPUÉS LO EJECUTA
//        ver33.createAndShowGUI();  

ese es mi problema espero me puedas ayudar y la verdad ya llevo algo de tiempo invertido y estoy desesperado.
gracias

Respuesta

Hola compañeros que tal buenas tardes les comento:

Ya e resuelto mi problema la solución era correr dos hilos a la vez y sincronizarlos la verdad no conocía nada de hilos todas las aplicaciones que había resuelto eran monotarea pero e aprendido como funcionan las aplicaciones Multitarea

esto me sirvió

http://panamahitek.com/multiprocesos-en-java-como-usar-hilosthreads/

http://static1.1.sqspcdn.com/static/f/923743/14996314/1320602051103/Mult...

Imagen de adrianaaae

Solo necesitas un hilo

Solo se necesita un hilo(podria ser el SwingWorker); el cual ira refrescando los componentes(en este caso la barra de progreso).
Y el hilo del proceso principal estara ejecutando la tarea principal.