1

私はJavaをブラッシュアップするための小さな目覚まし時計アプリケーションを作成しています。このアプリの目的は、ユーザーが時計の時刻と目覚まし時刻を設定できるようにすることです。システム時刻が目覚まし時刻と等しくなると、アラームが「鳴ります」。

clockクラスには、CalendarオブジェクトとDateオブジェクトが含まれています。

クロックは、クラス外のmainメソッドから参照されます。その主な方法では、ユーザーが時計とアラームの時刻を設定できる簡単なコマンドラインユーザーインターフェイスを構築しました。デフォルトでは、クロックは現在のシステム時刻に初期化されます。

ただし、ここで問題が自動的に初期化された時計オブジェクトとユーザー定義の時計オブジェクトの両方にあります。これらは「ティック」または更新されていません。

Clock regularClock = new Clock(); //Defaults clock (using a Date) to the system time

while (userInput != "Quit")
{
   switch(userInput)
   {
      ...Other choices here...
      case "Set Time":  System.out.print("Enter hour: ");
                    hours = kb.nextInt();
                System.out.print("\nEnter minutes: ");
                minutes = kb.nextInt();
                ACR.regularClock.setTime(hours, minutes);
                System.out.println("Clock has been set");

       case "Set Alarm": System.out.print("Enter hour: ");
            hours = kb.nextInt();
            System.out.print("\nEnter minutes: ");
            minutes = kb.nextInt();
            ACR.alarmClock.setTime(hours, minutes);
            ACR.alarmClock.setAlarmOn(true);
            System.out.println("Alarm has been set.");
            break;
      ...Other choices here...

  userInput = keyboard.next();
   }

ご覧のとおり、regularClockを更新またはチェックし続けるためのループなどはありません。何らかの理由で、私が始めたとき、DateオブジェクトとCalendarオブジェクトは、作成されると実行され続けると思いました-ストップウォッチのようなものです。

だから今、私はそれらを更新するための最良の方法は、このwhileループで何であるか疑問に思っています。デフォルトのシステム時刻のみが許可されていれば、それは簡単です。whileループの開始時に毎回新しいDateオブジェクトを作成するだけで済みます。ただし、それを選択した場合、ユーザーが作成した時刻が上書きされます。

また、ユーザーが入力を入力せず、代わりにアプリをそこに置いて入力を入力する場合でも、時刻を更新して、regularClock = alarmClocktimeかどうかを確認する必要がありますか?これどうやってするの?

今はとりとめのないものだと気付いたので、そのままにしておきます。私はこれに取り組んできましたが、最善の解決策を見つけることができません。ご不明な点がございましたら、お気軽にお問い合わせください。

簡単な要約の質問:

  1. 変更されている場合でも、日付またはカレンダーオブジェクトの時刻を刻むにはどうすればよいですか?

  2. ユーザー入力を待っている間、これらのオブジェクトを継続的に更新するにはどうすればよいですか?

4

2 に答える 2

3

より簡単な方法がありますが、それは問題ではありません;)

基本的に、バックグラウンドで時計を更新/変更できるある種の「ティック」スレッドを確立する必要があります...

これらのタスクを実行するために独自のThread/を作成することはできますが、本質的に不正確です...Runnable

何かのようなもの...

Thread thread = new Thread(new Ticker());
thread.setDaemon(true); // Otherwise the JVM won't stop when you want it t
thread.start();

//...

public class Ticker implements Runnable {
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException exp) {
            }
            // Update static reference to the clock...
        }
    }
}

ただし、注意してください

システムタイマーとスケジューラの精度と精度に応じて、現在実行中のスレッドを指定されたミリ秒数の間スリープ(一時的に実行を停止)させます。スレッドはモニターの所有権を失うことはありません。

別の方法は、java.util.Timer

Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new Ticker(), 1000, 1000);

//...

public class Ticker extends TimerTask {
    public void run() {
        // Update static reference to the clock...
    }
}

繰り返しますが、注意してください...

その後の実行は、ほぼ定期的に行われます。

于 2012-10-03T03:16:22.627 に答える
2

DateオブジェクトとCalendarオブジェクトは「実行」されません。これらは特定の時点を表します。あなたが探しているのはTimerクラスだと思います。

于 2012-10-03T03:06:36.313 に答える