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();
}
}
ya hay una clase Timer en java: http://www.exampledepot.com/egs/java.util/ScheduleRepeat.html