Netbeans - NO actualiza jtable dentro de un ciclo for

   
Vista:

NO actualiza jtable dentro de un ciclo for

Publicado por Sebastián Rubiolo (2 intervenciones) el 16/05/2014 01:00:11
Hola. Tengo dentro de un ciclo for una sentencia que agregar filas a un jtable. Lo hace bien, el tema es que la tabla se actualiza muestra todas las filas agregadas luego de finalizar todas las operaciones restantes. Y yo necesito que se actualice inmediatamente.
Muestro el código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void envia_USB(byte comando){
        byte[] out = new byte[2];
        out[0] = 0x00;
        out[1] = comando;
        int hora, minutos, segundos;
        DefaultTableModel tablaModelo = (DefaultTableModel) jTable1.getModel();
        try {
            for (int x=0; x<5;x++) {
 
                //obtengo la cptura desde el usb
                byte[] Respuesta = iface.QWriteRead(out, 2, 5, 1000);
                System.out.println(Respuesta);
 
                // convierte en short los valores del converso ad y los lleva a una variable int
                short valorAlto = Respuesta[1];
                short valorBajo = Respuesta[2];
                int valorArmado = ((valorAlto & 0xFF) << 8) | (valorBajo & 0xFF);
 
                //capturo la hora del momento
                DecimalFormat formateador = new DecimalFormat("####.###");
                String valorVoltaje = formateador.format((float)valorArmado*5/1024);
                System.out.print(valorArmado);
                Calendar calendario = Calendar.getInstance();
                hora =calendario.get(Calendar.HOUR_OF_DAY);
                minutos = calendario.get(Calendar.MINUTE);
                segundos = calendario.get(Calendar.SECOND);
 
                //incorporo en la tabla una fila nueva con los campos completados
                tablaModelo.addRow (new Object[]{ hora + ":" + minutos + ":" + segundos ,Respuesta[0], valorVoltaje, "0"});
 
                //supongo que  acá debería actualizar la tabla
                tablaModelo.fireTableDataChanged();
 
                // doy un 1 segundo para la siguiente captura
                Thread.sleep(1000);
 
            }
        } catch (Exception ex) {
            System.out.println("ERROR 1:" + ex.getMessage() + ex.getCause());
        }
    }

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

NO actualiza jtable dentro de un ciclo for

Publicado por Sebastián Rubiolo (2 intervenciones) el 18/05/2014 01:25:56
Lo resolví mediante hilos. Acomodé esta parte dentro de un public void run() y solo tengo que llamar al hilo cuando lo necesito.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

NO actualiza jtable dentro de un ciclo for

Publicado por xve (30 intervenciones) el 18/05/2014 10:09:09
Hola Sebastián, muchas gracias por comentarlo...

Nos podrías compartir el código de como ha quedado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

NO actualiza jtable dentro de un ciclo for

Publicado por Sebastián (1 intervención) el 20/05/2014 01:15:29
No hay problema. No se si lo puedo explicar bien, porque solo soy un curioso de la programación. Ahí va:
En la clase principal agregue una función Thread ( si así se llama):

1
2
3
4
5
6
7
8
public class JFrame_Principal extends javax.swing.JFrame implements Runnable{
 
    Thread Proceso1;
 
....
todo lo demás
....
}

y a la clase le agregué "implements Runnable".

Al final de la clase aparece la declaración "run" perteneciente a Thread y a ella le incorporé todo el código que publiqué al principio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Override
    public void run() {
        while (proceso1Activo) {
            int hora, minutos, segundos, milisegundos;
            DefaultTableModel tablaModelo = (DefaultTableModel) jTable1.getModel();
            try {
                Calendar calendario = Calendar.getInstance();
                hora =calendario.get(Calendar.HOUR_OF_DAY);
                minutos = calendario.get(Calendar.MINUTE);
                segundos = calendario.get(Calendar.SECOND);
                milisegundos = calendario.get(Calendar.MILLISECOND);
                jScrollPane2.getVerticalScrollBar().setValue(jScrollPane2.getVerticalScrollBar().getMaximum());
                tablaModelo.addRow (new Object[]{ proceso1Contado, hora + ":" + minutos + ":" + segundos + "," + milisegundos});
                int totalfilas =  tablaModelo.getRowCount () - 1;
                jTable1.setRowSelectionInterval(totalfilas, totalfilas);
                Thread.sleep(500);
                proceso1Contado++;
                jProgressBar1.setValue((int) (proceso1Contado * factorconversion));
            } catch (Exception ex) {
                System.out.println("ERROR 1:" + ex.getMessage() + ex.getCause());
                proceso1Activo = false;
            }
            if (nroCiclos == proceso1Contado){
                proceso1Activo = false;
                proceso1Contado = 0;
            }
        }
    }

Lo mostrado anteriormente lo varié un poco. En vez de un ciclo for puse un While y lo controlo con la variable booleana proceso1activo.
Desde un botón inicio el todo el procedimiento de run

1
2
3
4
5
6
7
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
 
        Proceso1 = new Thread(this);
        proceso1Activo = true;
        Proceso1.start(); //acá es donde inicia el procedimiento run
        nroCiclos = 3;
}

Todo esto me permite ejecutar procesos en "paralelo", por decirlo de alguna forma, a la ejecución de la clase completa.
Espero haber sido claro. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar