tipo refrescar programar nombre letra imprimir eventos crear como cambiar boton actualizar java swing thread-sleep event-dispatch-thread concurrency

java - refrescar - cómo actualizar jLabel cada vez con un ciclo while con un retraso



eventos jlabel java (2)

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { int count = jSlider1.getValue(); int delay = jSlider2.getValue(); int valueOfSlider = jSlider2.getValue(); int valueOfSlider2 = jSlider1.getValue(); while (count > 0) { count--; String count2 = ""+count; jLabel3.setText(count2); try {Thread.sleep(delay); } catch (InterruptedException ie) { } }

Eventualmente mostrará el número final en jLabel pero no actualiza incrementalmente el número. alguna ayuda


Tu problema es que haces algo que consume mucho tiempo en una devolución de llamada ActionPerformed, que se ejecuta en el hilo del evento. En las devoluciones de llamada, debe hacer algo rápidamente y regresar, incluso si ese "algo" está generando un hilo. La GUI no se puede actualizar mientras está ocupando el hilo del evento, solo se actualizará cuando regrese la devolución de llamada.


Swing es de un solo hilo . Por lo tanto, las tareas prolongadas nunca deberían tener lugar en el EDT . Esto incluye dormir. En su lugar, use un javax.swing.Timer . Esto retrasará un hilo de fondo y luego publicará una acción para ser ejecutada en el EDT.

Ver también:

import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.Timer; public final class JLabelUpdateDemo { public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI(){ final JFrame frame = new JFrame("Update JLabel Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().setLayout(new FlowLayout()); frame.getContentPane().add(JTimerLabel.getInstance()); frame.setSize(new Dimension(275, 75)); // used for demonstration purposes //frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); Timer t = new Timer(1000, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { int val = Integer.valueOf(JTimerLabel.getInstance().getText()); JTimerLabel.getInstance().setText(String.valueOf(++val)); } }); t.start(); } private static final class JTimerLabel extends JLabel{ private static JTimerLabel INSTANCE; private JTimerLabel(){ super(String.valueOf(0)); setFont(new Font("Courier New", Font.BOLD, 18)); } public static final JTimerLabel getInstance(){ if(INSTANCE == null){ INSTANCE = new JTimerLabel(); } return INSTANCE; } } }

Este SSCCE imita un contador que contará desde 0 por segundo (es decir, actualizará la instancia de JLabel ) hasta que finalice la aplicación.