Timer programmieren

didi577

Bekanntes Mitglied
Hallo,

ich möchte einen Timer programmieren. Die Zeit soll im Format mm:ss angezeigt werden. Zur Einstellung soll mit Klick auf einen JButton(+) mm um eins (eine Minute) erhöht werden. Mit Klick auf einen JButton(start) soll die Uhr rückwärts laufen, sprich mm:ss sollen auf null runter gezählt werden. Den GUI Kram bekomme ich hin. Mir fehlt der richtige Ansatz für den Timer. Kann mir jemand einen heissen Tipp geben wie ich den Timer am besten programmieren kann?
 

didi577

Bekanntes Mitglied
hab hier mal meinen Code. im Prinzip funktioniert der Timer schon einwandfrei, nur die Anzeige der Sekunden 60, 120 etc. soll durch mm:ss ersetzt werden..
Java:
public class Wecker extends JFrame {

   private static final long serialVersionUID = 1L;
   public static int minClicks = 0;
   public static Timer timer;
   private JButton plus, minus, start, reset;
   JLabel zeit;

   public Wecker() {

       bauen();
       addButton();
       methoden();
       
   }

   public void bauen() {

       ImageIcon imageIcon = new ImageIcon("d:/eclipse/workspace/Timer/src/TimerO/timer.png");
       this.setIconImage(imageIcon.getImage());
       this.setSize(280, 230);
       this.setLocationRelativeTo(null);
       this.setTitle("It's teatime 1.0");
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       this.setAlwaysOnTop(false);
       this.setFocusable(true);
       this.requestFocus();
       
       plus = new JButton("+");
       plus.setFont(new Font("Verdana", Font.BOLD, 18));
       plus.addActionListener(new plusAction());
       minus = new JButton("-");
       minus.setFont(new Font("Verdana", Font.BOLD, 24));
       minus.addActionListener(new minusAction());
       start = new JButton("Start");
       start.setFont(new Font("Verdana", Font.BOLD, 14));
       start.addActionListener(new startAction());
       reset = new JButton("Reset");
       reset.setFont(new Font("Verdana", Font.BOLD, 14));
       reset.addActionListener(new resetAction());
       zeit = new JLabel("0");
       zeit.setHorizontalAlignment(JLabel.CENTER);
       zeit.setFont(new Font("Verdana", Font.PLAIN, 42));
       zeit.setOpaque(true);
       zeit.setBackground(null);
   }

   public void addButton() {

       getContentPane().add(start, BorderLayout.PAGE_START);
       getContentPane().add(plus, BorderLayout.LINE_START);
       getContentPane().add(minus, BorderLayout.LINE_END);
       getContentPane().add(reset, BorderLayout.PAGE_END);
       getContentPane().add(zeit, BorderLayout.CENTER);
   }

   private class plusAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           minClicks += 60;
           zeit.setText("" + minClicks);
           if (minClicks > 0) {
               start.setBackground(Color.green);
           }
       }
   };

   private class minusAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           if (minClicks >= 1) {
               minClicks -= 60;
           }
           if (minClicks == 0) {
               start.setBackground(null);
           }
           zeit.setText("" + minClicks);
       }
   };

   private class resetAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           Wecker.timer.stop();
           minus.setEnabled(true);
           minClicks = 0;
           start.setBackground(null);
           zeit.setText("" + minClicks);

       }
   };

   private class startAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           if (minClicks > 0) {
               timer.start();
               minus.setEnabled(false);
               java.awt.Toolkit.getDefaultToolkit().beep();
           }


       }

   };

   public void methoden() {

       // Tastatursteuerung
       this.addKeyListener(new KeyListener() {

           @Override
           public void keyTyped(KeyEvent e) {

           }

           @Override
           public void keyReleased(KeyEvent e) {

           }

           @Override
           public void keyPressed(KeyEvent e) {

               if (e.getKeyCode() == KeyEvent.VK_ADD)
                   minClicks += 60;
               zeit.setText("" + minClicks);
               if (minClicks > 0) {
                   start.setBackground(Color.green);
               }
               if (e.getKeyCode() == KeyEvent.VK_SUBTRACT)
                   if (minClicks >= 1) {
                       minClicks -= 60;
                   }
               if (minClicks == 0) {
                   start.setBackground(null);
               }
               if (e.getKeyCode() == KeyEvent.VK_ENTER)
                   if (minClicks > 0) {
                       timer.start();
                       minus.setEnabled(false);
                       java.awt.Toolkit.getDefaultToolkit().beep();
                   }
           }
       });

       Wecker.timer = new Timer(1000, new ActionListener() {
           public void actionPerformed(ActionEvent e) {
               Wecker.minClicks--;
               zeit.setText("" + minClicks);
               if (minClicks == 10) { // Fenster ist die letzten 10
                   setAlwaysOnTop(true); // sec. immer im Vordergrund
               }
               if (minClicks == 5) {
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
               if (minClicks == 4) {
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
               if (minClicks == 3) {
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
               if (minClicks == 2) {
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
               if (minClicks == 1) {
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
               if (minClicks == 0) {
                   Wecker.timer.stop();
                   start.setBackground(null);
                   minus.setEnabled(true);
                   java.awt.Toolkit.getDefaultToolkit().beep(); 

               }

           }
       });

   }
}

public class WeckerProgramm {
   
   public static void main(String[] args) {
       
       try {

           UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
       } catch (Exception e) {
           e.printStackTrace();
       }
       
       JFrame frame = new Wecker();
       frame.setVisible(true);
       
   }
   
}
bekomme ich das in diesem Rahmen hin?
 

Joose

Top Contributor
Klar ist sogar ganz einfach: Schreib dir einfach eine Methode welche die einen Integer entgegennimmt.
Dieser wird dann in die entsprechenden Zeitstring umgewandelt und gibt diesen zurück.

Java:
Wecker.timer = new Timer(1000, new ActionListener() {
   public void actionPerformed(ActionEvent e) {
       Wecker.minClicks--;
       zeit.setText(formatToTime(minClicks));
       if (minClicks == 10) { // Fenster ist die letzten 10
           setAlwaysOnTop(true); // sec. immer im Vordergrund
       } else if (minClicks <= 5) {
           if (minClicks == 0) {
               Wecker.timer.stop();
               start.setBackground(null);
               minus.setEnabled(true);
           }
           java.awt.Toolkit.getDefaultToolkit().beep();
       }
   }
});

PS: hab dir deine if vereinfacht
 

didi577

Bekanntes Mitglied
@Joose
Schreib dir einfach eine Methode welche die einen Integer entgegennimmt.
Dieser wird dann in die entsprechenden Zeitstring umgewandelt und gibt diesen zurück.
ich probiere hier etwas herum
Java:
public void umwandeln() {
       
       Integer integer = new Integer(minClicks);
       
   }

die Methode würde ich so beginnen...
du hast in dem berichtigten Code bereits die Zeile:
Java:
  zeit.setText(formatToTime(minClicks));
eingefügt
ich komme nicht weiter, muss ich erst ein Date Objekt erzeugen um die mm:ss zu bekommen?
 

Joose

Top Contributor
Java:
public void umwandeln() {      
       Integer integer = new Integer(minClicks);      
   }
die Methode würde ich so beginnen...
Warum? "minClicks" ist doch schon ein int warum also ein Integer erzeugen? Welchen Vorteil erhoffst du dir davon?

du hast in dem berichtigten Code bereits die Zeile:
Java:
  zeit.setText(formatToTime(minClicks));
eingefügt
ich komme nicht weiter, muss ich erst ein Date Objekt erzeugen um die mm:ss zu bekommen?
Nein musst du nicht. Du hast die Variable "minClicks" welche die noch abzuzählende Sekunden enthält.
Du musst dir davon die Minuten ausrechnen und die restlichen Sekunden.
1 Minute = 60 Sekunden -> wie oft kommt 60 in minClicks vor?
Wie berechnest du dir dann die restlichen Sekunden?

Diese beiden Werte mit einen ":" dazwischen zusammenhängen und fertig (wobei ein Schönheitsfehler wird dir dann vl auffallen, aber denn solltest du selber lösen können ;))
 

didi577

Bekanntes Mitglied
@Joose
ich denke ich habs:
Java:
package TimerO;

import java.awt.BorderLayout;
import java.awt.Color;
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 java.text.DecimalFormat;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class Wecker extends JFrame {

   private static final long serialVersionUID = 1L;
   public static int minClicks = 0;
   public static Timer timer;
   private JButton plus, minus, start, reset;
   JLabel zeit;
   int mm = 0;
   int ss = 0;

   public Wecker() {

       bauen();
       addButton();
       methoden();

   }

   public void bauen() {

       ImageIcon imageIcon = new ImageIcon(
               "d:/eclipse/workspace/Timer/src/TimerO/timer.png");
       this.setIconImage(imageIcon.getImage());
       this.setSize(280, 230);
       this.setLocationRelativeTo(null);
       this.setTitle("It's teatime 1.0");
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       this.setAlwaysOnTop(false);
       this.setFocusable(true);
       this.requestFocus();

       plus = new JButton("+");
       plus.setFont(new Font("Verdana", Font.BOLD, 18));
       plus.addActionListener(new plusAction());
       minus = new JButton("-");
       minus.setFont(new Font("Verdana", Font.BOLD, 24));
       minus.addActionListener(new minusAction());
       start = new JButton("Start");
       start.setFont(new Font("Verdana", Font.BOLD, 14));
       start.addActionListener(new startAction());
       reset = new JButton("Reset");
       reset.setFont(new Font("Verdana", Font.BOLD, 14));
       reset.addActionListener(new resetAction());
       zeit = new JLabel("00:00");
       zeit.setHorizontalAlignment(JLabel.CENTER);
       zeit.setFont(new Font("Verdana", Font.PLAIN, 42));
       zeit.setOpaque(true);
       zeit.setBackground(null);
   }

   public void addButton() {

       getContentPane().add(start, BorderLayout.PAGE_START);
       getContentPane().add(plus, BorderLayout.LINE_START);
       getContentPane().add(minus, BorderLayout.LINE_END);
       getContentPane().add(reset, BorderLayout.PAGE_END);
       getContentPane().add(zeit, BorderLayout.CENTER);
   }

   private class plusAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           minClicks += 60;
           mm = minClicks / 60;
           DecimalFormat formatter = new DecimalFormat("00");
           String mmFormatted = formatter.format(mm);
           String ssFormatted = formatter.format(ss);
           zeit.setText(mmFormatted + ":" + ssFormatted);
           if (minClicks > 0) {
               start.setBackground(Color.green);

           }
       }
   };

   private class minusAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           if (minClicks >= 1) {
               minClicks -= 60;
               mm = minClicks / 60;
               DecimalFormat formatter = new DecimalFormat("00");
               String mmFormatted = formatter.format(mm);
               String ssFormatted = formatter.format(ss);
               zeit.setText(mmFormatted + ":" + ssFormatted);
           }
           if (minClicks == 0) {
               start.setBackground(null);
           }

       }
   };

   private class resetAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           Wecker.timer.stop();
           minus.setEnabled(true);
           minClicks = 0;
           start.setBackground(null);
           zeit.setText("00:00");

       }
   };

   private class startAction implements ActionListener {
       public void actionPerformed(ActionEvent e) {
           if (minClicks > 0) {
               timer.start();
               minus.setEnabled(false);
           }

       }

   };

   public void methoden() {

       Wecker.timer = new Timer(1000, new ActionListener() {
           public void actionPerformed(ActionEvent e) {
               Wecker.minClicks--;
               mm = minClicks / 60;
               ss = ((60 * mm)-minClicks) *-1;
               DecimalFormat formatter = new DecimalFormat("00");
               String mmFormatted = formatter.format(mm);
               String ssFormatted = formatter.format(ss);
               zeit.setText(mmFormatted + ":" + ssFormatted);
               if (minClicks == 10) {
                   setAlwaysOnTop(true);
               } else if (minClicks <= 5) {
                   if (minClicks == 0) {
                       Wecker.timer.stop();
                       start.setBackground(null);
                       minus.setEnabled(true);
                   }
                   java.awt.Toolkit.getDefaultToolkit().beep();
               }
           }
       });

   }
}
package TimerO;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.UIManager;

public class WeckerProgramm {
   
   public static void main(String[] args) {
       
       try {

           UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
       } catch (Exception e) {
           e.printStackTrace();
       }
       
       JFrame frame = new Wecker();
       frame.setVisible(true);
       
   }
   
}
ich weiß nicht ob das die schönste Lösung ist aber der Wecker läuft wie gewünscht
wobei ein Schönheitsfehler wird dir dann vl auffallen
hab noch nix gesehen..???
 

Joose

Top Contributor
ich weiß nicht ob das die schönste Lösung ist aber der Wecker läuft wie gewünscht
Ich würde das in eine eigene Methode auslagern, du hast die Umformung von minClicks zum Text 3x in der Klasse stehen.
Nehmen wir an du willst diese Ausgabe anpassen dann musst du das an 3 Stellen machen. Wenn du es in eine Methode auslagerst nur an einer ;)

Java:
    public static String formatToTime(int minClicks) {
       int minutes = minClicks / 60;
       int seconds = minClicks % 60;
       DecimalFormat formatter = new DecimalFormat("00");
       return formatter.format(minutes) + ":" + formatter.format(seconds);
   }
Habe auch die Berechnung für die Sekunden vereinfacht. Das "%" ist der Modulo Operator.

hab noch nix gesehen..???
Den hast du schon behoben indem du den DecimalFormatter verwendest :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Schneller Timer Java Basics - Anfänger-Themen 2
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
E Threads Timer Java Basics - Anfänger-Themen 6
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Audio + Timer Java Basics - Anfänger-Themen 12
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
W Timer erstellen Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
P Java Timer Java Basics - Anfänger-Themen 2
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
Piwi Timer bei Programmende beenden Java Basics - Anfänger-Themen 25
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
kulturfenster Problem mit javax.swing.Timer Java Basics - Anfänger-Themen 2
C Regelmäßigen Timer bei Zeitüberschreitung nacheinander abarbeiten Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
H Timer Java Basics - Anfänger-Themen 3
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
G Klasse mit Timer nicht beenden Java Basics - Anfänger-Themen 6
S Timer / TimerTask Frage Java Basics - Anfänger-Themen 8
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben