2016-11-14 20 views
0

ストップウォッチの開始/停止は、スペースバーを使用してのみ行います。私はすでにKeyListenersを作っていて、スペースバーを押して離したときにのみアクティブになります。私がこれまで試したどのようなスペースバーのみでストップウォッチを開始/停止するにはどうすればよいですか?

私は私が初めてのためのスペースを押すと、目と2回目との間の時間差を計算する必要がありますされ、ストップウォッチのクラスを作成してみました。毎秒スペースキーを押すだけで

public class Stopwatch { 
    public Stopwatch(int i) { 
     long time = System.currentTimeMillis(); 
     if(i%2==1){ 
      System.out.println("Timer Started at: " + time); 
     }else{ 
      System.out.println("Timer stopped at: " + System.currentTimeMillis()); 

      System.out.println("Time diff: " + (time - System.currentTimeMillis())); 
     } 

    }} 

int i増加:次のように私はそれを試してみました。

私はこのクラスを開始するたびにtimeがSystem.currentTimeMillis()にリセットされていることを知っています。スペースバーだけを押すためです。したがって、その差は常に0です。

私は最初にスペースを押した時間をどうにか保存できるように変更するにはどうすればよいですか?

Keylistenersを持つクラスです。スクランブラークラスを無視して、それは私の問題とは関係ありません。

import java.awt.Font; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.*; 

public class StoppuhrFrame extends JFrame { 

    JLabel time, scramble; 

    public StoppuhrFrame() { 

     time = new JLabel("00:00:00"); 
     time.setBounds(162, 45, 325, 80); 
     time.setFont(new Font("Arial", 100, 80)); 
     add(time); 

     scramble = new JLabel("Scramble: "); 
     scramble.setBounds(165, 15, 370, 16); 
     add(scramble); 

     //Scrambler scrambler = new Scrambler(scramble); 

     addKeyListener(new timer()); 
     setTitle("Cube Timer"); 
     setLayout(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 
     setSize(650, 270); 
     setVisible(true); 
    } 
    int i = 1; 
    public class timer implements KeyListener { 
     @Override 
     public void keyPressed(KeyEvent keyEvent) { 

      if(keyEvent.getKeyCode()==32){ 
       new Stopwatch(i); 
       i++; 
      } 

     @Override 
     public void keyReleased(KeyEvent arg0) { 

      if (arg0.getKeyCode() == 32) { 
       if(i%2==0){ 
        //new Scrambler(scramble); 

       } 
      } 
     } 

     @Override 
     public void keyTyped(KeyEvent arg0) { 
      // TODO Auto-generated method stub 

     } 

    }} 

ありがとうございます。

+0

キーを押すたびに新しいストップウォッチオブジェクトを作成するのはなぜですか?また、「1」になっても決して増えないので、「i」は決して変更されません。 – RealSkeptic

+0

キーイベントでストップウォッチロジックを実装しないのはなぜですか? – XtremeBaumer

+0

@realskeptic right、私はそれが変更できるように変更しました。 – fihdi

答えて

1

申し訳ありません申し訳ありませんが、コメントとして追加しようとしましたが、コードを投稿できませんでした。ここで私は

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Example implements KeyListener{ 

    private static long hitTime = -1; 

    @Override 
    public void keyPressed(KeyEvent arg0) { 
     // This will allways return the time when first space bar was clicked 
     long start = getHitTime(); 
     long actualTime = System.currentTimeMillis(); 
     // In this case get the seconds.. 
     long diff = (actualTime - start)/1000; 

     System.out.println(String.format("TIme diff: %s", diff)); 
} 

    @Override 
    public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 
    } 

    @Override 
    public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 
    } 

    public synchronized static long getHitTime() { 

     if (hitTime < 0) { 
      hitTime = System.currentTimeMillis(); 
     } 
     return hitTime; 
    } 
} 

を述べた例のクラスはまた、時間が最初のキークリックの後に渡して起動しますと(いない特定のキーがそのように検出されたこのケースでは、いずれかのキーのヒットがイベントをトリガする)ストップウォッチのクラスを必要とし、いけませんさ最初のクリックから最後のクリックまでの時間差をミリ秒で計算します。これを1000で割ってヒット数を秒単位で求めます。

希望します。

0

StopWatchユーザークラスの静的属性を負の値で初期化します(これはリスナーインスタンスである可能性があります)。その後、同期メソッドを適用してtime属性の値を取得します(静的に同期化され、更新時にそのvarへのスレッドセーフなアクセスが保証されます)。ストップウォッチクラスで

private static long hitTime = -1; 
//... 
public synchronized static long getFirstSpaceHitMillis() { 
    if (hitTime < 0) { 
     // this if ensures the variable will be only updated at first hit 
     hitTime = System.currentTimeMillis(); 
    } 
    return hitTime; 
} 

初期化時間はgetFirstSpaceHitMillisに静的呼び出しによって取得されますとスペースバーが押されたときに値> 0が可能であることを考慮すると、シングルトンパターンはNTO値を更新適用最初のスペースがヒットした時刻を取得します。

このヘルプをお待ちしており、申し訳ありませんが、完全な実装を添付していません。

+0

答えてくれてありがとうございます。しかし、私が 'private static long hitTime = -1'itを追加したいのであれば、常に無効な修飾子を削除するように求めています。どこでexcatly私はこれに対処する必要が付属してコードを追加する必要がありますか? – fihdi

+0

これはjava8でテストされたクラスの例です(ただし、最新のバージョンでは新しいコードを使用していないため、java 1.5より前のバージョンで動作します) –

+1

(a)何かを追加したい場合は、 2番目の答えを作成する*元の回答に追加する* [編集]することができます。 – RealSkeptic

関連する問題