質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    13786questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    227questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

[Java][Swing]ストップウォッチを作りたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,354

sirokuman

score 38

前提・実現したいこと

JavaでSwingを用いて、windows上で動作するストップウォッチ(スタート、ポーズ、ストップが出来る一番単純なモノ)を作っています。
以下に記載するWEBサイトを参考にして自分なりに作ってみたのですが、うまいこと動作してくれません。
どうかアドバイスをお願いします。

http://java-study.blog.jp/archives/1005563757.html
https://codezine.jp/article/detail/2597

[追記]発生している障害

TimeTable.javaの11行目(型変換のところ)で、NPEが発生していました。(KSwordOfHasteさん、ありがとうございました!)
該当箇所をif文で処理(下のソースにあります)したところ、NPEはでないでLabelに時間が表示されるようになったのですが、ミリ秒のままで。HH:mm:ssの形に直ってくれません。また、上記のWEBサイトでは初期化について触れていなかったため、出来ればそれも含めてアドバイスのほうをお願いします。

該当のソースコード(関係無いと思われる処理や記述は省略してあります)

MainPage.java(ストップウォッチを表示するメインページ)

public class MainPage extends JPanel{
static JLabel TimeLabel;
    MainPage(){
        TimeLabel = new TimeLabel();
        TimeLabel.setBounds(30,140,200,200);
        add(TimeLabel);
    }
}


MyActionListener.java(アクションリスナー)

public class MyActionListener implements ActionListener{
    static StopWatch stopWatch;
    if(StartButtonが押された){
        stopWatch = new StopWatch();
        stopWatch.start();
    }else if(PauseButtonが押された){
        stopWatch.suspend();
    }else if(StopButtonが押された){
        stopWatch.stop();
    }
}


TimeLabel.java

class TimeLabel extends JLabel{
    private DateFormat format;
    public TimeLabel(){
        setFont(new Font("Dialog",Font.BOLD,40));
        format = new SimpleDateFormat("HH:mm:ss");
        Timer t = new Timer();
        t.schedule(new TimerLabelTask(), 0,1000);//一秒毎に更新
    }
    class TimerLabelTask extends TimerTask {
        public void run(){
       if(MyActionListener.stopWatch != null){   
                String Time = String.valueOf(MyActionListener.stopWatch.getTime());//long to String
                setText(Time);
           }else{
                System.out.println("nullnullだ!");
           }
        }
    }
}

補足情報(言語/FW/ツール等のバージョンなど)

Java 8 , Apache Commons lang3を使用しております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

ミリ秒のままで。HH:mm:ssの形に直ってくれません。

https://codezine.jp/article/detail/2597 の例では、SimpleDateFormatを使っています。format.format()でHH:mm:ss形式にします。これはうまくゆきません。JSTの時差が9時間出ます。

String Time = format.format(MyActionListener.stopWatch.getTime());

StopWatch.toString()を使えば、hours:minutes:seconds.milliseconds 形式の表示になります。SimpleDateFormatは捨ててください。

String Time = MyActionListener.stopWatch.toString();

上記のWEBサイトでは初期化について触れていなかったため、出来ればそれも含めてアドバイスのほうをお願いします。

MyActionListenerのインスタンスを作った時にStopWatchのインスタンスもつくるのはどうでしょうか。

public class MyActionListener implements ActionListener{
public final StopWatch stopWatch = new StopWatch();


この場合、MyActionListenerは一度しかnewできません。

  MyActionListener myListerner = new MyActionListener();
  JButton btn1 = new JButton("StartButton");
  btn1.addActionListener(myListerner);
  JButton btn2 = new JButton("PauseButton");
  btn2.addActionListener(myListerner);
  JButton btn3 = new JButton("StopButton");
  btn3.addActionListener(myListerner);

イベント処理です。stop()は一度しか呼べないので使いません。MyActionListenerで以下のメソッドがペアで呼ばれるようにします。
resume() は suspend() が呼ばれた後でなければ呼べない。
start() は reset() が呼ばれた後でなければ2回呼べない。

初期状態では、PauseButton/StopButtonは押せない。StartButtonだけ押せる。

    if(StartButtonが押された){
        stopWatch.start();
        // StartButtonを押せなくする。
        // PauseButton/StopButtonを押せるようにする。
    }else if(PauseButtonが押された){
        // suspend()とresume()が交互に呼ばれるようにする。
    }else if(StopButtonが押された){
        stopWatch.reset();
        // PauseButton/StopButtonを押せなくする。
        // StartButtonを押せるようにする。
    }

MVCパターンで考えましょう

アドバイスが中途半端になってしまいました。MVCパターンを導入しましょう。初期化やボタン制御はMVCパターンで考えてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

関係無いと思われる処理や記述は省略してあります

適度な省略は問題点に焦点を合わせやすいので良い考えと思いますが、本件については少々省略しすぎのところがあります。例えばstopWatchをいつどこでどのように初期化しているかがわからないので、ひょっとして初期化を忘れていてNullPointerExceptionが発生しているのかも知れないし、さりとてNPEが発生しているとは書いてないので別のことが起こっているかもしれないし・・・という具合に、問題の可能性が色々考えられるので原因がしぼりにくくなります。

質問の際にどこが肝心な点かわからない場合は元のプログラムを極力短くはするがそのままで動くはずの完全なプログラムコードを載せるとよいと思います。

うまいこと動作してくれません。

残念ながら「うまく動かない」では「何が期待通りでないのか」ほぼわかりません。「期待と何が違うかを具体的に」書きましょう。例えば・・・

以下のコードでNullPointerExceptionが発生する

public void run(){
  String Time = String.valueOf(MyActionListener.stopWatch.getTime());//<=ここで例外
  setText(Time);
}

とか、「何秒経っても同じ時刻が表示されたまま」
とか、「時間がたつにつれて時刻がずれる」等々・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13786questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    227questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。