2017-03-31 14 views
1

スタートボタンを押すと、タイマーが新しいウィンドウを作成しています。表示の変更は新しいウィンドウでのみ行われますが、開始/停止機能は古いウィンドウでのみ機能します。私はここで何が起こっているのか分かりません。スタートが押されたときに新しいウィンドウを作成するのを止める方法を見つけ出すのに助けてくれますか?タイマーはスタート時に新しいウィンドウを作成します

私は3つのクラスを持っています。最初はタイマーを実行します。

package timer; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.Timer; 
import java.awt.event.*; 

public class TaskTimer extends TaskTimerWindow { 

    int seconds = 0; 
    int minutes = 0; 
    int hours = 0; 
    final int UNIT = 1000; 
    boolean stopped = false; 
    Timer timer; 

    public TaskTimer() { 

     ActionListener go = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       count();  
      } 
     }; 

     timer = new Timer(UNIT, go); 
     timer.start();  
    } 

    public void resume() { 
     if(stopped) { 
      seconds = 0; 
      minutes = 0; 
      hours = 0; 
     } 
    } 

    public void end() { 
     timer.stop(); 
    } 

    public void count() { 
     if(seconds < 59) { 
      seconds++; 
     } else if(minutes < 59) { 
      seconds = 0; 
      minutes++; 
     } else { 
      seconds = 0; 
      minutes = 0; 
      hours++; 
     } 
     changeDisplay(String.format("%02d", hours) + ":" 
      + String.format("%02d", minutes) + ":" 
      + String.format("%02d", seconds)); 
    } 
} 

2つ目は、ディスプレイを作成して更新します。

package timer; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.event.ActionListener; 

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


public class TaskTimerWindow extends JFrame { 

    JLabel timeDisplay; 
    JButton start, stop, pause; 

    public TaskTimerWindow() { 

     JPanel timerWindow = new JPanel(); 
     JPanel buttonSpace = new JPanel(); 

     timeDisplay = new JLabel("00:00:00"); 
     timeDisplay.setHorizontalAlignment((int) CENTER_ALIGNMENT); 
     timeDisplay.setFont(new Font("Arial", Font.PLAIN, 48)); 

     timeDisplay.setBackground(Color.WHITE); 

     timerWindow.add(timeDisplay); 

     start = new JButton("Start"); 
     stop = new JButton("Stop"); 
     pause = new JButton("Pause"); 

     buttonSpace.add(start); 
     buttonSpace.add(stop); 
     buttonSpace.add(pause); 

     getContentPane().add(timerWindow, BorderLayout.NORTH); 
     getContentPane().add(buttonSpace); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setTitle("Task Timer"); 
     pack(); 
    } 

    public JLabel getText() { 
     return timeDisplay; 
    } 

    public void changeDisplay(String time) { 
     getText().setText(time); 
    } 

} 

そして、3番目がコントローラです。

package timer; 

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

public class ControlTimer { 
    boolean stopped = false; 
    boolean paused = false; 
    TaskTimer timer; 


    public ControlTimer() { 
     TaskTimerWindow window = new TaskTimerWindow(); 
     window.start.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       timer = new TaskTimer(); 
      } 
     }); 

     window.stop.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       stopped = true; 
       timer.end(); 
      } 
     }); 

     window.pause.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       paused = true; 
      } 
     }); 
    } 
} 
+0

だからあなたがする以前のタイマーが必要なのか新しいタイマーが始まると停止しますか? –

+0

打撃スタートは、一般にタイマーを開始する必要があります。私は複数のタイマーを必要としません。 – Kendra

答えて

1

したがって、主な問題はControlTimerクラスにあります。 TaskTimerTaskTimerWindowになると、開始ボタンを押すたびに新しいウィンドウが作成されていたためです。あなたは、次のようにそれを修正する必要があります。

public class ControlTimer { 
    boolean stopped = false; 
    boolean paused = false; 
    TaskTimer timer; 


    public ControlTimer() { 
     timer = new TaskTimer(); 
     timer.start.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       timer.resume(); 
       timer.start(); 
      } 
     }); 

     timer.stop.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       timer.stopped = true; 
       timer.end(); 
      } 
     }); 

     timer.pause.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       timer.end(); 
      } 
     }); 
    } 
} 

TaskTimerクラス(コンストラクタからtimer.start()を削除し、代わりに別のstart()方法を導入する際にいくつかのマイナーな変更があります:

public TaskTimer() { 

    ActionListener go = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      count(); 
     } 
    }; 

    timer = new Timer(UNIT, go); 
} 

public void start() { 
    timer.start(); 
} 
関連する問題