2014-03-06 5 views
0

두 개의 jlabel이있는 jPanel을 루프로 만들고 이 레이블을 다시 작성하는 방법으로 JFrame을 열고 자합니다. 물론 루프에 thread.sleep이 있습니다. BUT 알아낼 수 없지만, 내 스레드가 1 .. 2 .. 3을 실행하기 시작합니다.이 작업이 끝나면 JFrame이 열립니다.스윙 : JLabel로 작성

여기에 내가 지금까지 쓴 한 내 코드입니다 : 물론

FrmPruebaPlanillon vtnPruebaPlanillon = new FrmPruebaPlanillon(); 
    vtnPruebaPlanillon.setVisible(true); 

    boolean infinito = true; 
    while(infinito)//todo ver con cuidado 
    {  
     //enviamos los comando por fila para podrer rellenar los datos del 
     //taximetro con el boleto generado 
     System.out.println(FrmPrincipal.linea()+"Inició la prueba "+  (contadorDePrueba+1)); 
     //pp.getLblNEnvio().setText((contadorDePrueba+1)+""); 
     vtnPruebaPlanillon.getLblNEnvio().setText((contadorDePrueba+1)+""); 
     vtnPruebaPlanillon.getLblDatoEnviado().setText(fila[contadorDePrueba]); 
     //pp.getLblDatoEnviado().setText(fila[contadorDePrueba]); 



     //#######################################################################3 
     pruebaPorTabla(tipoPrueba, datosCsv); 
     //pruebaPorFila(tipoPrueba, fila[contadorDePrueba]); 
     //vtnFrmBoleto.setParametrosPrueba(tipoPrueba, tblPrueba, numeroPrueba, taximetro, empresa); 
     //pone un numero de prueba en la ventana boleto 
     if(contadorDePrueba == 0) 
     { 
      //vtnFrmBoleto.getLblNprueba().setText((String) tblPrueba.getModel().getValueAt(0, 0)); 
     }   
     //vtnFrmBoleto.setVisible(true); 
     contadorDePrueba++; 
     if(contadorDePrueba==dataTabla.length-1) 
     { 
      System.out.println("numero de lineas enviadas"+contadorDePrueba); 
      infinito=false; 
     } 

    }  
+0

* 물론 루프에서 나는 thread.sleep을 가지고 있지만, 알아낼 수는 없지만, 내 스레드는 1 .. 2 .. 3 ..을 실행하기 시작하고,이 때 JFrame이 열립니다. 이 질문을보십시오 : http://stackoverflow.com/questions/15600203/thread-sleep-inside-of-actionperformed-method –

+0

EDT (Event Dispatch Thread) 스레드에서 자고 있습니까? –

+0

@ PM77-1 분명히. :) –

답변

2

, EDT에 Thread.sleep();를 호출 내 commnet에서 지적했듯이 이러한 예기치 않은 동작이 발생합니다. 적절한 구성 요소를 대신 사용하십시오. 이 경우 Timer을 스윙하십시오. 여기에 당신을위한 작은 데모가 있습니다 :

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class RepaintDemo { 

    JFrame frame = new JFrame("Repaint demo"); 
    JLabel labelFirst = new JLabel("First label"); 
    JLabel labelSecond = new JLabel("Second label"); 
    JLabel[] labels = { labelFirst, labelSecond }; 
    JPanel panel = new JPanel(); 
    Timer timer; 
    int i = 0; 

    public RepaintDemo() { 
     // Wait for 3 seconds and then add label 
     timer = new Timer(3000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       panel.add(labels[i]); 
       panel.repaint(); 
       panel.revalidate(); 
       i++; 
       if (i == labels.length) { 
        timer.stop(); 
       } 
      } 
     }); 
     // Adds next label after every 3 seconds 
     timer.setDelay(3000); 
     timer.setRepeats(true); 
     timer.start(); 

     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new RepaintDemo(); 
      } 
     }); 
    } 

} 

당신이 볼 수 있듯이 JFrame은 시작시 나타납니다. 3 초 후 첫 번째 레이블이 나타납니다. 3 초 후에 두 번째 레이블이 나타납니다.

+0

감사합니다. – Premier