3

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);
4

1 に答える 1

5

それは怖かったです、それは私がそれがすべきだと思ったより簡単に働きました...

基本的に、ラベルのテキストを更新するために使用できるある種の「ティッカー」が必要です...

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.Timer500ミリ秒ごとにティックするaを使用することです(キャッチエッジの場合)。

ラベルのテキストを仮想的に設定することで、自動的に再描画リクエストを投稿し、私たちの生活をシンプルにします...

于 2013-02-27T04:36:39.720 に答える