2017-08-22 2 views
0

Ich habe überall gesucht und keine Lösung für dieses Problem gefunden, also poste ich es hier. Grundsätzlich habe ich einen Countdown-Timer, der von 180 Sekunden herunter zählt und es erfolgreich an die Konsole druckt. Dieser Timer befindet sich in einer Klasse namens "Model", aber mit Getter habe ich den aktuellen Wert dieses Timers in die Klasse "View" importiert, die alle grafischen Elemente enthält. Auch wenn es erfolgreich auf der Konsole gedruckt wird, wird das JLabel nicht aktualisiert, es liest einfach die ganze Zeit "180".Update JLabel für Timer verwendet

Dies ist die Modellklasse mit dem Timer:

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


public class Model { 
    private int counter = 180; 
    //private String meme; 
    public Model(){ 
     ActionListener al=new ActionListener() { 
      public void actionPerformed(ActionEvent ae) { 
       if(counter>0) { 
        counter = counter - 1; 
        System.out.println(counter); 

       } 

      } 
     }; 
     Timer timer=new Timer(1000,al); 
     timer.start(); 

    } 

    public String getCounter(){ 
     return String.valueOf(counter); 
    } 
} 

Die Ansichtsklasse ist sehr groß, so habe ich nur den ersten Teil enthalten, die den Code für den Timer und Etikett enthält:

*Other GUI elements initialization* 
private JLabel timeLabel=new JLabel("0"); 
Model model = new Model(); 
timeLabel.setText(model.getCounter()); 
*Other unrelated code* 
JPanel east = new JPanel(); 
JPanel eastCenter = new JPanel(); 
JPanel eastCenterNorth = new JPanel(); 
east.setLayout(new BorderLayout()); 
eastCenter.setLayout(new BorderLayout()); 
eastCenterNorth.setLayout(new GridLayout(2,1)); 
east.add(eastCenter,BorderLayout.CENTER); 
eastCenter.add(eastCenterNorth,BorderLayout.NORTH); 
eastCenterNorth.add(timeLabel); 
*Other GUI placement code* 

Wenn Sie die vollständige ungeschnittene Ansicht Klasse möchten, sagen Sie einfach das Wort, aber ich sollte Sie warnen, es ist ein ziemlicher Schandfleck.

+0

Post mindestens die Code, wo Sie die '' JLabel'' aktualisieren –

+0

Das ist, was ich nicht verstehe, ich kann nicht herausfinden, was zu setzen und wo es für den Updater – bpfuels

+0

Ich nehme an, dass Sie die '' timeLabel'', So ändern müssen Sie müssen Zugriff darauf in Ihrer '' Model'' Klasse haben, um sie zu ändern. –

Antwort

1

Wenn Sie eine schnelle und einfache Lösung wollen, können Sie die Ansicht sichtbar für das Modell machen:

public class Model { 
    ... 
    private YourViewClass view; // + setter, or init through constructor 

} 

In der Ansichtsklasse, fügen Sie eine Methode um den Timer zu aktualisieren:

public void updateTimerText(String text) { 
    timeLabel.setText(text); 
} 

Fügen Sie in der ActionListener-Definition den Aktualisierungsaufruf innerhalb der if-Bedingung hinzu:

+0

Ja. Ein allgemeinerer, aber auch komplizierterer Ansatz würde das Beobachter/Hörer-Muster implementieren. –

+0

Vielen Dank! – bpfuels