una tiempo temporizador regresivo método hora hilos especifica ejemplos ejecutar cronometro contador con como alarma java swing user-interface jlabel

tiempo - timer java eclipse



JLabel mostrando cuenta regresiva, java (4)

Tengo un JLabel de "estado" en una clase (llamado Bienvenida) y el temporizador en otra (llamado Temporizador). En este momento, el primero muestra la palabra "estado" y el segundo debe hacer la cuenta regresiva. Como me gustaría, pero no sé cómo, mostrar 10, 9, 8, 7 ... 0 (y luego ir a la siguiente ventana). Mis intentos hasta ahora:

// class Welcome setLayout(new BorderLayout()); JPanel area = new JPanel(); JLabel status = new JLabel("status"); area.setBackground(Color.darkGray); Font font2 = new Font("SansSerif", Font.BOLD, 25); status.setFont(font2); status.setForeground(Color.green); area.add(status, BorderLayout.EAST); // can I put it in the bottom-right corner? this.add(area);

y el cronómetro:

public class Timer implements Runnable { // public void runThread() { // new Thread(this).start(); // } public void setText(final String text) { SwingUtilities.invokeLater(new Runnable() { public void run() { setText(text); // link to status here I guess } }); } public void run() { for (int i = 10; i > 0; i--) { // set the label final String text = "(" + i + ") seconds left"; setText(text); // // sleep for 1 second // try { // Thread.currentThread(); // Thread.sleep(1000); // } catch (Exception ex) { // } } // go to the next window UsedBefore window2 = new UsedBefore(); window2.setVisible(true); } public static void main(String[] args) { // TODO Auto-generated method stub // runThread(); } } // end class


¿Por qué no poner el método setText en la clase de bienvenida y simplemente hacer ''status.setText (text)''?

Y puede intentar BorderLayout.SOUTH o .PAGE END o .LINE END para obtener el temporizador en la esquina inferior derecha


Como usa Swing, debe usar javax.swing.Timer , no java.util.Timer. Puede configurar el temporizador para disparar a intervalos de 1 segundo (1000 ms) y hacer que el oyente realice la actualización. Como las actualizaciones de Swing deben tener lugar en el hilo de envío del evento, su oyente es el lugar perfecto para status.setText .


Estoy de acuerdo en que deberías considerar usar un temporizador "Java" según Anh Pham, pero en realidad, hay varias clases de temporizador disponibles, y para tus propósitos un temporizador de oscilación no un temporizador java.util. como lo sugiere Anh se adaptaría a tus propósitos mejor.

En cuanto a su problema, en realidad no es más que un simple problema de referencias. Asigne a la clase con la etiqueta un método público, digamos setCountDownLabelText(String text) , y luego llame a ese método desde la clase que contiene el temporizador. Necesitará tener una referencia de la clase de GUI con el temporizador JLabel en la otra clase.

Por ejemplo:

import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Welcome extends JPanel { private static final String INTRO = "intro"; private static final String USED_BEFORE = "used before"; private CardLayout cardLayout = new CardLayout(); private JLabel countDownLabel = new JLabel("", SwingConstants.CENTER); public Welcome() { JPanel introSouthPanel = new JPanel(); introSouthPanel.add(new JLabel("Status:")); introSouthPanel.add(countDownLabel); JPanel introPanel = new JPanel(); introPanel.setPreferredSize(new Dimension(400, 300)); introPanel.setLayout(new BorderLayout()); introPanel.add(new JLabel("WELCOME", SwingConstants.CENTER), BorderLayout.CENTER); introPanel.add(introSouthPanel, BorderLayout.SOUTH); JPanel usedBeforePanel = new JPanel(new BorderLayout()); usedBeforePanel.setBackground(Color.pink); usedBeforePanel.add(new JLabel("Used Before", SwingConstants.CENTER)); setLayout(cardLayout); add(introPanel, INTRO); add(usedBeforePanel, USED_BEFORE); new HurdlerTimer(this).start(); } private static void createAndShowUI() { JFrame frame = new JFrame("Welcome"); frame.getContentPane().add(new Welcome()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { createAndShowUI(); } }); } public void setCountDownLabelText(String text) { countDownLabel.setText(text); } public void showNextPanel() { cardLayout.next(this); } } class HurdlerTimer { private static final int TIMER_PERIOD = 1000; protected static final int MAX_COUNT = 10; private Welcome welcome; // holds a reference to the Welcome class private int count; public HurdlerTimer(Welcome welcome) { this.welcome = welcome; // initializes the reference to the Welcome class. String text = "(" + (MAX_COUNT - count) + ") seconds left"; welcome.setCountDownLabelText(text); } public void start() { new Timer(TIMER_PERIOD, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (count < MAX_COUNT) { count++; String text = "(" + (MAX_COUNT - count) + ") seconds left"; welcome.setCountDownLabelText(text); // uses the reference to Welcome } else { ((Timer) e.getSource()).stop(); welcome.showNextPanel(); } } }).start(); } }