2016-11-26 2 views
-2

Ich weiß nicht, wie Sie diesen Code insid emy Programme setzen. Likee..if ich auf den Button klicken oder mit der Maus in JPanel (das in der Originalplatte ist), wird das Programmtimer in java button

static class Action implements ActionListener(){ 
    public void actionPerformed (ActionEvent e){ 
     long serialVersionUID = 1L; 
     Timer timer; 
     long startTime = -1; 
     long duration = 1200000 ; 
     JLabel label = new JLabel; 
     timer = new Timer(10, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (startTime < 0) { 
        startTime = System.currentTimeMillis(); 
       } 
       long now = System.currentTimeMillis(); 
       long clockTime = now - startTime; 
       if (clockTime >= duration) { 
        clockTime = duration; 
        timer.stop(); 
       } 
       SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS"); 
       label.setText(df.format(duration - clockTime)); 
      } 
     }); 
+2

'new JLabel; '...? – Tunaki

+0

Was möchten Sie mit diesem Code erreichen? Wenn Sie eine Schaltfläche möchten, die für eine Zeit gesperrt werden kann, erstellen Sie eine Klasse für diese –

+0

Ich möchte diesen Code in das Jpanel hinzufügen, aber ich weiß nicht, wie es geht. selbst wenn ich es hinzugefügt und eine Klasse erstellt habe, hat JPanel mir den Timer nicht gezeigt @JarlikStepsto –

Antwort

0

laufen Dies ist ein typisches Problem der neuen Programmierer zu finden Code kopieren sie dann und Einfügen überall Sie denken, dass es funktionieren könnte. Wie du schon bemerkt hast .... es ist nicht so einfach, sonst wärst du offensichtlich nicht hier um Unterstützung zu suchen.

Es gibt eine Reihe von Dingen, die mit Ihrem bereitgestellten Code schief gehen, und genau deshalb werde ich Ihnen Code zur Verfügung stellen, der Ihnen zeigt, wie dies mit einem Local Timer in einem JButton Action Event funktionieren kann spezifische Probleme, so dass Sie sie für später umsetzen können, sollten Sie wieder auf solche Dinge stoßen.

Sie müssen Ihre Timer-Variable nicht deklarieren und später auf der Straße initialisieren. Sie können die Timer Variable rechts auf der gleichen Linie, zum Beispiel deklarieren und initialisieren:

Ihre Long-Datentyp Startzeit Variable wird nie innerhalb eines Local Timer arbeiten oder jede innere (lokale) Klasse für die wichtig, wo Wertänderungen vorgenommen werden müssen. Für Ihre startTime Variable, die innerhalb der Local Timer Class verwendet werden soll, muss sie den vollen Gültigkeitsbereich dort haben und dafür muss die Variable als final deklariert werden. Uhhh, es gibt jedoch ein Problem damit, Sie können den Wert innerhalb einer letzten Variablen nicht ändern, was eine Voraussetzung dafür ist, dass dieser Countdown-Timer ordnungsgemäß funktioniert. Wenn wir den starttime Variable als final nicht erklären Sie dann werden wir nur mit einer „lokalen Variablen von einer inneren Klasse referenziert wird, muss endgültiger oder effektiv endgültig“ am Ende Compiler-Fehler. Die Lösung dieses Problems ist dann zu erklären und initialisieren die starttime Variable innerhalb der Local Timer-Klasse selbst wie folgt aus:

final Timer timer = new Timer(10, new ActionListener() { 
    long startTime = -1; 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     .................. 
     .................. 
    } 
}); 

, dass dieses kleine Problem löst. Jetzt haben Sie noch ein weiteres Problem, Sie können nicht nur Ihren Timer mit der Timer.stop() -Methode stoppen und stoppen, wie Sie es getan haben (zB: timer.stop();) innerhalb des Timers actionPerformed Ereignis Aus dem einfachen Grund hat der variable Timer dort keinen gültigen Bereich und kann nicht sehen, dass er initialisiert wurde. Ja, es wird wahrscheinlich kompilieren und es wird höchstwahrscheinlich laufen bis die timer.stop() -Methode aufgerufen wird, und dann erhalten Sie eine Laufzeitausnahme ("Variable Timer wurde möglicherweise nicht initialisiert"). Nicht gut, und denke nicht daran, die Ausnahme zu fangen und Vergangenes vergangen zu sein, weil du den Timer letztendlich nicht stoppen wirst (mieses Üben). Sie müssen nur ein wenig schicker mit Ihrem Stop zu bekommen, und dies wird den Trick:

((Timer)event.getSource()).stop(); 
//event is the ActionEvent variable (usually evt in some IDE's). 

jetzt Ihre Dauer Variable, es ist nichts falsch mit diesem, wenn Sie mögen es noch 1 lange Zahlenwerte liefern Minute des Timings. Funktioniert gut, wenn das dein Ding ist, aber für mich persönlich mag ich es einfach 60 anstatt 60000 einzugeben.Es spielt keine Rolle, ob der Wert fest codiert wird, aber wenn es tatsächlich ein angegebener Wert ist (unabhängig davon, woher), dann ist es besser, Sekunden (IMHO) zu liefern, was natürlich die Verwendung einer zusätzlichen Variablen beinhalten würde zum Beispiel:

int seconds = 10; 
final long duration = seconds * 1000; 

Jetzt müssen Sie nur die Anzahl der Sekunden, die Sie möchten, dass Ihre Countdown-Timer eingestellt werden bei versorgen. Ein anderes Problem, das Sie haben, ist, dass Sie eine Variable mit dem Namen Label deklariert haben, um ein JLabel zu repräsentieren, aber nirgendwo verweisen Sie entweder diese Variable auf ein tatsächliches JLabel irgendwo oder fügen sie zu einem Rahmen oder einer Panel-Komponente hinzu. Ich denke, dass Sie bereits eine JLabel in Ihrem GUI installiert ist (wenn Sie eine GUI) in diesem Fall müssen Sie die JLabel Variablennamen angeben, wenn Sie die Label Variable deklarieren, wie folgt aus:

JLabel label = (JLabel)jLabel1; 

Auf diese Weise repräsentiert die Label-Variable das JLabel jLabel1 innerhalb Ihrer GUI.

Und schließlich (und das ist ein biggy) wird Ihr Timer einfach nicht laufen, wenn Sie es nicht dazu sagen. Wo dies Sie tun, na ja, direkt unter Local Timer Klasse natürlich :) wie folgt aus:

final Timer timer = new Timer(10, new ActionListener() { 
    long startTime = -1; 
    @Override 
    public void actionPerformed(ActionEvent event) { 
     .................. 
     .................. 
    } 
}); 
timer.start(); 

Anyways, hier ist der vollständige Code, wie versprochen:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    int seconds = 10; // supply timer duration in seconds 
    final long duration = seconds * 1000; // calculate to milliseconds 
    JLabel label = (JLabel)jLabel1; //whichever JLabel is in GUI 
    final Timer timer = new Timer(10, new ActionListener() { 
     long startTime = -1; 
     @Override 
     public void actionPerformed(ActionEvent event) { 
      if (startTime < 0) { 
       startTime = System.currentTimeMillis(); 
      } 
      long now = System.currentTimeMillis(); 
      long clockTime = now - startTime; 
      if (clockTime >= duration) { 
       clockTime = duration; 
       ((Timer)event.getSource()).stop(); // stop the Timer 
       label.setText("Time Is UP"); // remove if you want or maybe just "" 
       return; 
      } 
      SimpleDateFormat df = new SimpleDateFormat("mm:ss:SSS"); 
      label.setText(df.format(duration - clockTime)); 
     } 
    }); 
    timer.start(); 
}