2016-03-29 10 views
1

Ich habe eine Haupt-GUI-Klasse, die in der NetBeans Gui-Builder gemacht wurde. Ich erstelle ein Minispiel, in dem der Timer von JLabel ausfällt. Das JLabel befindet sich in der Haupt-GUI, und der Zeitgeber befindet sich beispielsweise in separaten Klassen mit der Bezeichnung timer. Wenn die Schleife für den Timer eine Schleife bildet, möchte ich, dass sich das JLabel, das sich in der Hauptgui befindet, ändert (Timer = 10, Timer = 9, ... usw.).Ändern Sie Label-Text aus verschiedenen Klassen in Java

Überprüfen Sie den folgenden Beispielcode zum besseren Verständnis.

Dies ist die Klasse, wo der Timer befindet:

public class ShapeGame { 

Timer timer; 
int counter = 10; 

ShapeGame() { 

    ActionListener a = new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      System.out.println("Counter = " + counter); 
      labTimer.setText("Timer: " + counter); 
      if (--counter < 0) { 
       timer.stop(); 
       System.exit(0); 
      } 
     } 
    }; 

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

Diese geänderte Code für wo die JLabel befindet:

(Anmerkung: nicht alle Code für die JLabel und JFrame wurden hinzugefügt nur für Zwecke)

public class mainGui extends JFrame { 

labTimer = new javax.swing.JLabel(); 

    private void gameStartStopActionPerformed(java.awt.event.ActionEvent evt) {            
     ShapeGame sg = new ShapeGame(); 
    } 
} 

Lesen verstehe ich dies nicht der richtige Weg ist, labTimer.setText("Timer: " + counter); das Label aus einer anderen Klasse zu nennen. Ich hoffe, ich habe genug Informationen zur Verfügung gestellt, um dieses Problem zu lösen.

+1

Übergeben Sie entweder eine Referenz des Labels an den ActionListner (nicht die beste Lösung) oder richten Sie ein Observer-Muster mit dem ActionLisyener ein, so dass es interessierte Parteien benachrichtigen kann, wenn es sich ändert – MadProgrammer

Antwort

2

Eine mögliche einfache (aber nicht saubere) Lösung besteht darin, das JLabel in die ShapeGame-Klasse zu übergeben, damit es seinen Status direkt ändern kann.

z.B.

public class ShapeGame { 
    Timer timer; 
    int counter = 10; 

    // note change to constructor parameter 
    public ShapeGame(final JLabel label) { 
     ActionListener a = new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Counter = " + counter); 

       // note changes 
       // labTimer.setText("Timer: " + counter); 
       label.setText("Timer: " + counter); 

       if (--counter < 0) { 
        timer.stop(); 
        System.exit(0); 
       } 
      } 
     }; 

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

Wenn dann der ShapeGame Klasse erstellen, die in seine JLabel Konstruktoraufruf geben. Cleaner wäre es, Ihr Programm a la MVC zu strukturieren.

Verwandte Themen