Quero que o for execute o setVisible a cada um segundo
public void apagar(ArrayList<JLabel> lista){
JLabel ap = null;
for(int i = 2; i < 13; i++){
ap = (lista.get(i));
ap.setVisible(false);
try
{
Thread.sleep(1000); // espera 1 segundo
}
catch(InterruptedException e)
{
}
}
Quando eu aperto o botão desta ação , ele demora uns 5 segundos e depois apaga as labels tudo de uma vez e não de uma bbem uma a cada um segundo??
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.
http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html
Experimente rodar o programa abaixo.
package guj;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class ExemploLimparLabels extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel jContentPane = null;
private JPanel pnlBotoes = null;
private JButton btnOK = null;
private JPanel pnlLabels = null;
private List<JLabel> labels = null;
private JButton btnCancelar = null;
private JPanel getPnlBotoes() {
if (pnlBotoes == null) {
pnlBotoes = new JPanel();
pnlBotoes.setLayout(new FlowLayout());
pnlBotoes.add(getBtnOK(), null);
pnlBotoes.add(getBtnCancelar(), null);
}
return pnlBotoes;
}
/**
* This method initializes btnOK
*
* @return javax.swing.JButton
*/
private JButton getBtnOK() {
if (btnOK == null) {
btnOK = new JButton();
btnOK.setText("Limpar");
btnOK.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
btnOK.setEnabled(false);
btnCancelar.setEnabled(true);
thread = new Thread(new Runnable() {
@Override
public void run() {
for (final JLabel label : labels) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Só pra ficar mais interessante:
if (label.isVisible())
label.setVisible(false);
else
label.setVisible(true);
}
});
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
break;
}
}
btnOK.setEnabled(true);
}
});
thread.start();
}
});
}
return btnOK;
}
private JPanel getPnlLabels() {
if (pnlLabels == null) {
labels = new ArrayList<JLabel>();
for (int i = 0; i < 10; ++i) {
JLabel label = new JLabel();
label.setText(String.format("Label # %d", i + 1));
labels.add(label);
}
pnlLabels = new JPanel();
pnlLabels.setLayout(new BoxLayout(getPnlLabels(), BoxLayout.Y_AXIS));
for (JLabel label : labels) {
pnlLabels.add(label, null);
}
}
return pnlLabels;
}
private JButton getBtnCancelar() {
if (btnCancelar == null) {
btnCancelar = new JButton();
btnCancelar.setText("Cancelar");
btnCancelar.setEnabled(false);
btnCancelar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
btnCancelar.setEnabled(false);
thread.interrupt();
}
});
}
return btnCancelar;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
ExemploLimparLabels thisClass = new ExemploLimparLabels();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}
public ExemploLimparLabels() {
super();
initialize();
}
private void initialize() {
this.setSize(300, 251);
this.setContentPane(getJContentPane());
this.setTitle("Limpar Labels com Threads");
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getPnlLabels(), BorderLayout.CENTER);
jContentPane.add(getPnlBotoes(), BorderLayout.SOUTH);
}
return jContentPane;
}
private Thread thread;
}