Foro sobre Java SE > Refrescar JLabel
Hasta que no termine el ActionListener del botón, no se actualiza nada. Por eso es inevitable utilizar una solución como la que sigue. Se usa JavaSE 1.8 para los lambdas; sin embargo SwingWorker se puede usar desde JavaSE 1.6
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.SwingWorker;
public class NewJFrame extends javax.swing.JFrame {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
jButton1.addActionListener((ActionEvent e) -> {
SwingWorker<Integer, Integer> swingWorker = new SwingWorkerImpl();
swingWorker.execute();
});
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
jButton1.setText("Comenzar");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGap(0, 199, Short.MAX_VALUE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(jButton1)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
java.awt.EventQueue.invokeLater(() -> {
new NewJFrame().setVisible(true);
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private final javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
// End of variables declaration
private class SwingWorkerImpl extends SwingWorker<Integer, Integer> {
@Override
protected Integer doInBackground() throws Exception {
int indice = 0;
for (; indice <= 10000; indice++) {
publish(indice);
Thread.sleep(200); // el bucle es tan rápido que no daría tiempo a ver la actualización del label sin esta línea
}
return indice;
}
@Override
protected void process(List<Integer> indices) {
indices.stream().forEach((Integer indice1) -> {
jLabel1.setText(Integer.toString(indice1));
});
}
}
}
Hola, un saludo a todos.
Soy principiante en Java y no consigo refrescar un JLabel.setText situado dentro de un bucle for.
Me explico. Cuando hago click en un boton comienza un bucle a contar hasta 10000 y en cada iteracion le paso el valor a la propiedad text de JLabel, el problema es que no se refresca, solo veo el 10000 cuando acaba el evento click del boton.
private void btnComenzarActionPerformed(java.awt.event.ActionEvent evt) {
for (Integer i=0;i<10000;i++) {
this.JLabel1.setText(i.toString());
}