2016-11-26 10 views
-2

私はこのコードをinsid emyプログラムに入れる方法がわかりません。私は(それは、元のパネルの内側にあります)のJPanelのボタンまたはマウスでクリックしLikee..if、プログラムはタイマーのJavaボタン

static class Action implements ActionListener(){ 
    public void actionPerformed (ActionEvent e){ 
     long serialVersionUID = 1L; 
     Timer timer; 
     long startTime = -1; 
     long duration = 1200000 ; 
     JLabel label = new JLabel; 
     timer = new Timer(10, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (startTime < 0) { 
        startTime = System.currentTimeMillis(); 
       } 
       long now = System.currentTimeMillis(); 
       long clockTime = now - startTime; 
       if (clockTime >= duration) { 
        clockTime = duration; 
        timer.stop(); 
       } 
       SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS"); 
       label.setText(df.format(duration - clockTime)); 
      } 
     }); 
+2

'新しいJLabelのは、 '...? – Tunaki

+0

このコードでは何を達成したいですか?ボタンが必要な場合は、一度ロックすることができます。このクラスを作成します。 –

+0

このコードをJpanelの中​​に追加したいのですが、どうやって行うのか分かりません。たとえ私がそれを追加してクラスを作成したとしても、JPanelはタイマーを表示しませんでした@JarlikStepsto –

答えて

0

を実行しますこれは、それをコピーし、どこにそれを貼り付け、コードを見つける新しいプログラマの典型的な問題です彼らは働くかもしれないと思います。すでに実現したように、そう簡単ではありませんが、ここでは助けを求めているわけではありません。

提供されたコードにはいくつかの問題があります。これは、JButton Action Event内でローカルタイマーを使用してどのように動作するかを示すコードを提供するものです。この種の問題に再び遭遇した場合には、後でそれを実現することができます。

タイマを変数として宣言する必要はありません。その後、道路上で後で初期化する必要はありません。次の例のように、同じ行にタイマーに変数権利を宣言し、初期化することができます。

あなたのLongデータ型のstartTime変数は、そのためのローカルタイマーまたは任意の内部(ローカル)クラス内で動作することはありません価値の変化が起こる必要がある事項。 startTime変数をローカルタイマークラス内で使用するには、そこでフルスコープを実行する必要があり、変数をfinalと宣言する必要があります。しかし、これには問題があります。このカウントダウンタイマーが正常に機能するためには、最終変数内の値を変更することはできません。我々は最終としてのstartTime変数を宣言しない場合、我々だけでコンパイルエラー「最終または効果的に最終でなければならない内部クラスから参照し、ローカル変数」になってしまいます。その小さな問題を解決

final Timer timer = new Timer(10, new ActionListener() { 
    long startTime = -1; 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     .................. 
     .................. 
    } 
}); 

:これを解決するには、このようなローカルTimerクラス自体の中のstartTime変数を宣言して初期化することです。タイマーののactionPerformedイベント内のTimer.stop()メソッド(つまり、timer.stop();)を使用して、Timer.stop()メソッドを使用してTimerを起動して停止することはできません簡単な理由から、変数タイマーには適切なスコープがなく、初期化されていることがわかりません。はい、おそらくコンパイルされ、timer.stop()メソッドが呼び出されてランタイム例外が返されるまで実行されます("可変タイマーが初期化されていない可能性があります")。いいえ、あなたが最終的にタイマー(泥酔した練習)を止めないので、例外をキャッチし、過ぎ去ったことを過ぎ去らせることについて考えないでください。あなたは自分のストップで少し手の込んだを取得する必要があり、これはトリックを行います:あなたも1のために長い数の値を指定したい場合は、あなたの期間、今変数を

((Timer)event.getSource()).stop(); 
//event is the ActionEvent variable (usually evt in some IDE's). 

を、これでは何の問題もありませんタイミングの分。それがあなたのものなら素晴らしいですが、個人的に私は60000の代わりに60に入るのが好きです。値がハードコードされているかどうかは問題ではありませんが、実際に供給される値(どこからでも)であれば、追加変数を使用する秒数(IMHO)を指定する方が良いでしょうたとえば、

int seconds = 10; 
final long duration = seconds * 1000; 

ここで、カウントダウンタイマーを設定する秒数を指定するだけで済みます。

もう1つの問題は、というラベルがというJLabelを表すと宣言したことですが、その変数を実際のJLabelのどこかで参照することも、フレームまたはパネルコンポーネントに追加することもありません。私はすでにあなたのGUI内のJLabelをインストールしていることを考え、あなたはこのように、ラベル変数を宣言するときに、そのJLabelの変数名を指定する必要があります。その場合には(あなたはGUIを持っている場合):

JLabel label = (JLabel)jLabel1; 

このようにして、ラベル変数はGUI内にjLabel1という名前のJLabelを表します。

そして最後に(そしてこれは大変です)、あなたがそうするよう指示しなければ、あなたのタイマーは動かないでしょう。あなたがこれを行うのですかどこで、あなたのローカルタイマークラス、このような:)もちろん良く、右下:

final Timer timer = new Timer(10, new ActionListener() { 
    long startTime = -1; 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     .................. 
     .................. 
    } 
}); 
timer.start(); 

とにかく、ここにある約束どおり完全なコードです:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    int seconds = 10; // supply timer duration in seconds 
    final long duration = seconds * 1000; // calculate to milliseconds 
    JLabel label = (JLabel)jLabel1; //whichever JLabel is in GUI 
    final Timer timer = new Timer(10, new ActionListener() { 
     long startTime = -1; 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      if (startTime < 0) { 
       startTime = System.currentTimeMillis(); 
      } 
      long now = System.currentTimeMillis(); 
      long clockTime = now - startTime; 
      if (clockTime >= duration) { 
       clockTime = duration; 
       ((Timer)event.getSource()).stop(); // stop the Timer 
       label.setText("Time Is UP"); // remove if you want or maybe just "" 
       return; 
      } 
      SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS"); 
      label.setText(df.format(duration - clockTime)); 
     } 
    }); 
    timer.start(); 
} 
関連する問題