我正在尝试制作一个在 JOptionPane 中显示时间的数字时钟。我设法在消息对话框中显示了时间。但是,我无法弄清楚如何让它在对话框中每秒更新一次时间。
这是我目前拥有的:
Date now = Calendar.getInstance().getTime();
DateFormat time = new SimpleDateFormat("hh:mm:ss a.");
String s = time.format(now);
JLabel label = new JLabel(s, JLabel.CENTER);
label.setFont(new Font("DigifaceWide Regular", Font.PLAIN, 20));
Toolkit.getDefaultToolkit().beep();
int choice = JOptionPane.showConfirmDialog(null, label, "Alarm Clock", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
最佳答案
这很可怕,它比我认为的更容易工作......
基本上,您需要某种可用于更新标签文本的“自动收报机”...
public class OptionClock {
public static void main(String[] args) {
new OptionClock();
}
public OptionClock() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
Date now = Calendar.getInstance().getTime();
final DateFormat time = new SimpleDateFormat("hh:mm:ss a.");
String s = time.format(now);
final JLabel label = new JLabel(s, JLabel.CENTER);
label.setFont(new Font("DigifaceWide Regular", Font.PLAIN, 20));
Timer t = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Date now = Calendar.getInstance().getTime();
label.setText(time.format(now));
}
});
t.setRepeats(true);
t.start();
int choice = JOptionPane.showConfirmDialog(null, label, "Alarm Clock", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
t.stop();
}
});
}
}
因为我们不想违反 Swing 的单线程规则,所以最简单的解决方案是使用一个 javax.swing.Timer
,它每 500 毫秒左右计时一次(捕获边缘情况) .
通过虚拟设置标签的文本,它会自动发布重绘请求,这让我们的生活变得简单......
关于java - 更新 JOptionPane 中的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104259/