0

私のストップウォッチは私に奇妙な時間を与えています。16:00:00:000と表示され、ミリ秒スロットに秒を入れています。問題はどういうわけか日付フォーマッターだと思います。dateformaterがなく、decimalformaterを使用するだけで、正しく出力されます。時間、分、秒を表示するために必要です。

public class StopWatchTest extends JLabel implements ActionListener {

    private static final String Start = "Start";
    private static final String Stop = "Stop";
    private SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");

    private Timer timer = new javax.swing.Timer(100, this);
    private long now = System.currentTimeMillis();

    public StopWatchTest() {
        this.setHorizontalAlignment(JLabel.CENTER);
        this.setText(when());
    }

    public void actionPerformed(ActionEvent ae) {
        setText(when());
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }

    private String when() {
        return df.format((System.currentTimeMillis() - now) / 1000d);
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final StopWatchTest jtl = new StopWatchTest();
        jtl.setFont(new Font("Dialog", Font.BOLD, 32));
        f.add(jtl, BorderLayout.CENTER);

        final JButton button = new JButton(Stop);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (Stop.equals(cmd)) {
                    jtl.stop();
                    button.setText(Start);
                } else {
                    jtl.start();
                    button.setText(Stop);
                }

            }
        });
        f.add(button, BorderLayout.SOUTH);
        f.pack();
        f.setVisible(true);
        jtl.start();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                create();
            }
        });
    }
}
4

2 に答える 2

4

DateFormatミリ秒の値で指定された瞬間をフォーマットし、それを使用して間隔をフォーマットしようとしています。JDKにはユースケースをカバーするものはありませんが、JodaTimeはカバーします。とにかく、JodaTimeを使用する必要があります。

于 2012-11-06T18:11:20.590 に答える
0

Markoが指摘したことに加えて、明示的に定義されていないdoubleをフォーマットしようとします。Javaは、java.text.Formatからformat(Object)関数を呼び出します。少なくともDateオブジェクトをパラメータとして使用する必要があります。例:

return df.format(new Date(System.currentTimeMillis() - now));

Markoを除いて、これは実用的な解決策になると思いますが、忘れないでください。SimpleDateFormatはスレッドセーフではありません(Alanに感謝)

于 2012-11-06T18:22:57.920 に答える