2017-03-31 5 views
1

Mein Timer erstellt ein neues Fenster mit nicht funktionierenden Tasten, wenn ich den Startknopf drücke. Die Änderung der Anzeige erfolgt nur im neuen Fenster, aber die Start/Stop-Funktionalität funktioniert nur im alten Fenster. Ich bin mir nicht sicher, was hier vor sich geht. Kann mir jemand helfen, herauszufinden, wie ich verhindern kann, dass beim Start ein neues Fenster erstellt wird?Timer erzeugt ein neues Fenster beim Start

Ich habe drei Klassen, mit denen ich arbeite. Der erste führt den Timer aus.

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)); 
    } 
} 

Die zweite erstellt und aktualisiert das Display.

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); 
    } 

} 

Und der dritte ist der Controller.

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

So brauchen Sie Ihre vorherigen Timer Stoppen Sie, wenn neu gestartet wird –

+0

Hitting Start sollte den Timer im Allgemeinen starten.Ich brauche nicht mehrere Timer. – Kendra

Antwort

1

So ist das Hauptproblem in Ihrer ControlTimer Klasse. Als TaskTimer erweitert TaskTimerWindow wurde jedes Mal ein neues Fenster erstellt Start Schaltfläche wurde gedrückt. Sie sollten es ändern wie folgt vor:

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(); 
      } 
     }); 
    } 
} 

Auch gibt einige kleinere Änderungen in TaskTimer Klasse sind (timer.start() aus Konstruktor zu entfernen und stattdessen getrennte start() Verfahren zur Einführung:

public TaskTimer() { 

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

    timer = new Timer(UNIT, go); 
} 

public void start() { 
    timer.start(); 
}