2016-07-18 18 views
1

ストップウォッチを作成しようとしていましたが、私はいくつかのyoutubeビデオとコードの助けを借りてそれを行うことができましたここに見つかりました。しかし、これらのコードには2つのJButtonオブジェクトがあり、1つは開始し、もう1つはタイマーを停止します。 1人のボタンからスタートとストップの両方の機能を実行するために私を助けてくれますか?前もって感謝します。Timer.start()/ Timer.stop()メソッドを実行するために同じボタンに2つのActionListenerを追加する方法

私が試したことの1つは以下のとおりです。

import javax.swing.*; 
import java.awt.event.*; 

public class Test extends JFrame 
{ 
private Timer t; 
private int sec, min, hrs; 
static private JPanel p; 
private JButton start; 
private JLabel l1; 

public Test() 
{ 
    p = new JPanel(); 
    l1 = new JLabel("" + hrs + " : " + min + " : " + sec); 
    start = new JButton("Start"); 
    start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      t = new Timer(1000, new ActionListener() { 
       public void actionPerformed(ActionEvent ev) 
       { 
        sec++; 
        if (sec == 60) 
        { 
         min++; 
         sec = 0; 
        } 
        if (min == 60) 
        { 
         hrs++; 
         min = 0; 
        } 
        l1.setText("" + hrs + " : " + min + " : " + sec); 
        start.setText("Stop"); 

       } 
      }); 
      t.start(); 
      if(start.getText().equals("Stop")) 
      { 
       start.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent eve) 
        { 
         t.stop(); 
        } 
       }); 
      } 
     } 
    }); 

    p.add(l1); 
    p.add(start); 
} 

public static void main(String[] args) 
{ 
    Test te = new Test(); 
    te.add(p); 
    te.setSize(240, 360); 
    te.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    te.setVisible(true); 
} 
} 

答えて

0

このようなクラス試してみてください:

class ToggleButton extends JButton { 
    private boolean selected; 
    private String otherText; 

    public ToggleButton(String text, String otherText) { 
     super(text); 
     this.otherText = otherText; 
     this.setSelected(true); 
     this.fixListener(); 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

    private void fixListener() { 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       if (isSelected()) { 
        setSelected(false); 
        t.start(); 
       } else { 
        setSelected(true); 
        t.stop(); 
       } 
       String text = getText(); 
       setText(otherText); 
       otherText = text; 
      } 
     }); 
    } 
} 

をそして、このようにそれを呼び出す:これはまた、タイマーがこれをも停止してから、別のボタンまたは方法で起動することができるかどうかということJButton start = new ToggleButton("Start","Stop");

ボタンを更新する必要があります。だから、setSelected()は公開されている。

また、タイマークラスを追加して、タイマーに役立てます。 new Timer(ping);(pingは、ティック間の遅延をミリ秒で示す整数)を実行して初期化します。 start()pause()をそれぞれ使用して起動し、一時停止します。

public class Timer extends Thread { 
    private Thread thread; 
    private boolean running; 
    private boolean paused; 
    private int ping; 

    public Time(int ping){ 
     this.ping = ping; 
     running = false; 
     paused = true; 
    } 

    private void loop(){ 
     while(running){ 
      if(paused){ 
       tick();//check at the end 
      } 
      delay(ping); 
     } 
    } 

    private void delay(int mil) { 
     try { 
      Thread.sleep(mil); 
     } catch (InterruptedException e) { 
     } 
    } 

    public void start() { 
     if (thread == null) { 
      thread = new Thread(this); 
      thread.start(); 
     }else{ 
      paused = false; 
     } 
    } 

    public void pause(){ 
     paused = true; 
    } 

    public void reset(){ 
     thread = null; 
     running = false; 
     paused = true; 
    } 

    @Override 
    public void run() { 
     running = true; 
     paused = false; 
     loop(); 
    } 
} 

public void tick(){ 
    sec++; 
    if (sec >= 60){ 
     min++; 
     sec = sec - 60; 
    } 
    if (min >= 60){ 
     hrs++; 
     min = min - 60; 
    } 
} 

はちょうどこのように変更し、あなたのテストクラスを修正、あなたのテストクラスにこのメソッドを追加します。

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Test extends JFrame { 
    private Timer timer; 
    private int sec, min, hrs; 
    private JPanel panel; 
    private JButton start; 
    private JLabel label1; 

    public Test() { 
     panel = new JPanel(); 
     label1 = new JLabel("" + hrs + " : " + min + " : " + sec); 
     timer = new Timer(1000); 
     start = new ToggleButton("Start", "Stop"); 
     panel.add(label1, BorderLayout.NORTH); 
     panel.add(start, BorderLayout.SOUTH); 
     getContentPane().add(panel, BorderLayout.CENTER); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Test test = new Test(); 
     test.setSize(240, 360); 
     test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public void tick() { 
     sec++; 
     if (sec >= 60) { 
      min++; 
      sec = sec - 60; 
     } 
     if (min >= 60) { 
      hrs++; 
      min = min - 60; 
     } 
     label1.setText("" + hrs + " : " + min + " : " + sec); 
    } 

    private class ToggleButton extends JButton { 
     private boolean selected; 
     private String otherText; 

     public ToggleButton(String text, String otherText) { 
      super(text); 
      this.otherText = otherText; 
      this.setSelected(true); 
      this.fixListener(); 
     } 

     public boolean isSelected() { 
      return selected; 
     } 

     public void setSelected(boolean selected) { 
      this.selected = selected; 
     } 

     private void fixListener() { 
      addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent arg0) { 
        if (isSelected()) { 
         setSelected(false); 
         timer.start(); 
        } else { 
         setSelected(true); 
         timer.pause(); 
        } 
        String text = getText(); 
        setText(otherText); 
        otherText = text; 
       } 
      }); 
     } 
    } 

    private class Timer extends Thread { 
     private Thread thread; 
     private boolean running; 
     private boolean paused; 
     private int ping; 

     public Timer(int ping) { 
      this.ping = ping; 
      running = false; 
      paused = true; 
     } 

     private void loop() { 
      while (running) { 
       if (!paused) { 
        tick(); 
       } 
       delay(ping); 
      } 
     } 

     private void delay(int mil) { 
      try { 
       Thread.sleep(mil); 
      } catch (InterruptedException e) { 
      } 
     } 

     public void start() { 
      if (thread == null) { 
       thread = new Thread(this); 
       thread.start(); 
      } else { 
       paused = false; 
      } 
     } 

     public void pause() { 
      paused = true; 
     } 

     @Override 
     public void run() { 
      running = true; 
      paused = false; 
      loop(); 
     } 
    } 
} 
+0

こんにちはニック、すばやく答えるために感謝します。クラスを追加してToggleButtonを呼び出そうとしましたが、ボタンのテキストが開始ボタンをクリックしたときに変更されましたが、停止しません。私のやり方は以下の通りです – Ting

+0

コメントにコードを書くことができないことを知りませんでした。さて、私は自分のコードからt.start()setText( "Stop")を削除し、宣言中にTogglebuttonを呼び出しました。 start = new ToggleButton( "Start"、 "Stop");もうコードを説明してください。 – Ting

+0

@Tingボタンに別のactionListenerを追加する必要はありません。それはすでに準備ができています。 –

0

あなたがいるか否かを表し、フィールドを宣言することができますタイマーはオンです。 ActionListenerでは、この変数が呼び出されたときにこの変数の状態を確認し、それに基づいてタイマーを停止または開始することができます。

start.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent eve){ 
     if(timerIsOn) 
      t.stop(); 
     else 
      t.start(); 
     timerIsOn = !timerIsOn; // This will toggle the value of the variable, so if it was false it will now be true and vice versa 

    } 
}); 

あなたが宣言し、フィールドの名前でtimerIsOnを交換し、あなたが値falseでそれを初期化することを確認します。

関連する問題