java - 更新 JOptionPane 中的消息

标签 java swing jlabel joptionpane

我正在尝试制作一个在 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/

相关文章:

java - 如何在 MAC OS 中使用 java.awt.FileDialog 检测用户是否按下了取消按钮或选择了根目录(主磁盘)?

java swing 1.6 Textinput 喜欢firefox吧

java - 问题在面板数组中的 JButton 上设置约束

java - Swing:JLabel 会缩短中间太长的文本

java - 组布局中的 JLabel - 卡住大小

Java - 异常的 GridLayout 行为

java - Java 中的密码重置

java - 使用 pem 证书打开 SSL 套接字

java - 在 Java 中序列化 Document 对象,同时保留任意元素的格式

java - 从 Jlist 获取选定的项目