O Swing é meio chatinho com threads. Ele exige que as atualizações de tela sejam feitas na thread principal do Swing, que pode ser acessada usando um método chamado invokeLater.
packageguj;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.util.ArrayList;importjava.util.List;importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.SwingUtilities;publicclassExemploLimparLabelsextendsJFrame{privatestaticfinallongserialVersionUID=1L;privateJPaneljContentPane=null;privateJPanelpnlBotoes=null;privateJButtonbtnOK=null;privateJPanelpnlLabels=null;privateList<JLabel>labels=null;privateJButtonbtnCancelar=null;privateJPanelgetPnlBotoes(){if(pnlBotoes==null){pnlBotoes=newJPanel();pnlBotoes.setLayout(newFlowLayout());pnlBotoes.add(getBtnOK(),null);pnlBotoes.add(getBtnCancelar(),null);}returnpnlBotoes;}/** * This method initializes btnOK * * @return javax.swing.JButton */privateJButtongetBtnOK(){if(btnOK==null){btnOK=newJButton();btnOK.setText("Limpar");btnOK.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEvente){btnOK.setEnabled(false);btnCancelar.setEnabled(true);thread=newThread(newRunnable(){@Overridepublicvoidrun(){for(finalJLabellabel:labels){SwingUtilities.invokeLater(newRunnable(){@Overridepublicvoidrun(){// Só pra ficar mais interessante:if(label.isVisible())label.setVisible(false);elselabel.setVisible(true);}});try{Thread.sleep(1000);}catch(InterruptedExceptionex){break;}}btnOK.setEnabled(true);}});thread.start();}});}returnbtnOK;}privateJPanelgetPnlLabels(){if(pnlLabels==null){labels=newArrayList<JLabel>();for(inti=0;i<10;++i){JLabellabel=newJLabel();label.setText(String.format("Label # %d",i+1));labels.add(label);}pnlLabels=newJPanel();pnlLabels.setLayout(newBoxLayout(getPnlLabels(),BoxLayout.Y_AXIS));for(JLabellabel:labels){pnlLabels.add(label,null);}}returnpnlLabels;}privateJButtongetBtnCancelar(){if(btnCancelar==null){btnCancelar=newJButton();btnCancelar.setText("Cancelar");btnCancelar.setEnabled(false);btnCancelar.addActionListener(newjava.awt.event.ActionListener(){publicvoidactionPerformed(java.awt.event.ActionEvente){btnCancelar.setEnabled(false);thread.interrupt();}});}returnbtnCancelar;}publicstaticvoidmain(String[]args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){ExemploLimparLabelsthisClass=newExemploLimparLabels();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true);}});}publicExemploLimparLabels(){super();initialize();}privatevoidinitialize(){this.setSize(300,251);this.setContentPane(getJContentPane());this.setTitle("Limpar Labels com Threads");}privateJPanelgetJContentPane(){if(jContentPane==null){jContentPane=newJPanel();jContentPane.setLayout(newBorderLayout());jContentPane.add(getPnlLabels(),BorderLayout.CENTER);jContentPane.add(getPnlBotoes(),BorderLayout.SOUTH);}returnjContentPane;}privateThreadthread;}