Klassen Zusammenspiel zwischen 2 Klassen

OSbOoL

Mitglied
Moin aus dem Norden,
ich habe immer noch Probleme mit mehreren klassen zu arbeiten.
Wenn ich meine kleinen Programme in meiner Main-Klasse programmiere, habe ich immer keine probleme, aber wenn ich es so schön aufgeräumt versuche, wie es sich gehört, dann treten immer wieder Probleme auf.
Aktuell habe ich eine Main-Klasse, die eine grafische Benutzeroberfläche hat. Alles gut, nun möchte ich auf dieser Oberfläche eine Digitaluhr ausgeben. Funktioniert auch soweit.
Jetzt möchte ich aber gerne, dass jede Sekunde aus der Klasse "Digitaluhr" eine Methode in der Klasse Main ausgeführt wird und gleichzeitig sollen die Stunden sowie die Minuten als Int übergeben werden. Ich weiß aber nicht wie ich das bewerkstelligen soll.

Hier meine Klasse:
Java:
import java.awt.Color;
import java.awt.Font;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Digitaluhr extends JPanel implements Runnable {

private static final long serialVersionUID = 1L;

private JLabel label;


private Font font = new Font("Verdana", Font.PLAIN, 20);

private Thread thread;

public Digitaluhr() {
    label = new JLabel();
    label.setFont(font);
    label.setOpaque(true);
    label.setBackground(Color.LIGHT_GRAY);
    this.add(label);
    start();
}

 

private void gibDate() {
      LocalDateTime now = LocalDateTime.now();
      DateTimeFormatter df;
      df = DateTimeFormatter.ofPattern("dd.MM.yyyy kk:mm");     // 31.01.2016 20:07
    
    label.setText(now.format(df));
}



public void start() {
    if (thread == null) {
        thread = new Thread(this);
        thread.start();
    }
}

public void run() {

    while (true) {
      
        gibDate();
      
   //     setTime();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
                e.printStackTrace();
        }
    }
}


}

Um die Stunde oder Minute als Int umzuwandeln ist für mich kein Problem. Ich möchte gerne zu einer bestimmten Uhrzeit in der anderen Klasse ein Relais schalten, daher möchte ich gerne die Werte als Int rüber geben.


Vielen Dank
 
ich habe immer noch Probleme mit mehreren klassen zu arbeiten.
Das liegt daran, dass Du zu sehr auf das UI fokussiert bist.

Du willst eine Art Zeitschaltuhr programmieren. Woraus besteht so ein Teil? Sagen wir mal, es gibt etwas wie ein "Uhrwerk". Das Uhrwerk misst die Zeit. Das ist schön, nur hilft das wenig, wenn das kein "sichtbares" Ergebnis liefert. Daher gibt es an diesem Uhrwerk eine Schnittstelle, über die das Ergebnis zur Verfügung gestellt wird. An dieser Schnittstelle kann man dann beliebige Komponenten anstöpseln.

Bei einem analogen Uhrwerk wäre diese Schnittstelle z. B. eine Achse, die sich jede Sekunde ein wenig dreht. Daran lässt sich dann ein Zeiger befestigen, um die Sekunden anzuzeigen. Man könnte aber auch einen weiteren "Zeiger" befestigen, der nicht zur Anzeige dient sondern der nach jeder Umdrehung einen Mechanismus auslöst (z. B. ein Glöckchen klingeln lässt). Was alles an so eine Achse betrieben werden kann, ist nahezu grenzenlos.

Zurück zur Zeitschaltuhr. Es gibt also eine Schnittstelle, über die das Uhrwerk die aktuelle Zeit zur Verfügung stellt. An diese Schnittstelle kann man ein Display anschließen, das die Zeit anzeigt oder ein Relais, das zu einem Zeitpunkt schaltet völlig egal.

Wie lässt sich das nun in Code realisieren? Wir wollen ein Uhrwerk haben, das die Möglichkeit bietet, beliebige "Beobachter" (s. Observer-Pattern) über Änderungen zu informieren. Wir brauchen also eine Schnittstelle für "Uhrwerkbeobachter":

Java:
interface Uhrwerkbeobachter {
    void zeitAktualisiert(Uhrwerk werk, LocalDateTime neuerZeitpunkt);
}

Das Uhrwerk bietet die Möglichkeit, derlei Beobachter zu registrieren und zu informieren:
Code:
class Uhrwerk {
    private List<Uhrwerkbeobachter> alleBeobachter = new LinkedList<>();

    public void registriere(Uhrwerkbeobachter beobachter) {
        alleBeobachter.add(beobachter);
    }

    private void informiereBeobachter(LocalDateTime zeitpunkt) {
        for (Uhrwerkbeobachter beobachter : alleBeobachter) {
            beobachter.zeitAktualisiert(this, zeitpunkt);
        }
    }
}

Das Display registriert nun einfach einen Beobachter, z. B. sich selbst:
Java:
class Display extends JPanel implements Uhrwerkbeobachter {
    @Override
    public void zeitAktualisiert(Uhrwerk werk, LocalDateTime zeitpunkt) {
        zeigeNeueUhrzeit(zeitpunkt);
    }
}

Das gleiche kannst Du mit einem Relais machen:
Java:
class Relais implements Uhrwerkbeobachter {
    @Override
    public void zeitAktualisiert(Uhrwerk werk, LocalDateTime zeitpunkt) {
        // tu irgendwas, z. B. schalte, wenn der Schaltzeitpunkt überschritten wurde
    }
}

Natürlich brauchst Du Code, der alles zusammenfügt, z. B.
Java:
class Zeitschaltuhr {
    public void run() {
        Uhrwerk uhrwerk = new Uhrwerk();
        Display display = new Display();
        Relais relais = new Relais();

        // zusammenstöpseln
        uhrwerk.registriere(display);
        uhrwerk.registriere(relais);

        // jetzt noch Display anzeigen und das Uhrwerk starten
    }
}

Die Namen sind nicht besonders schön gewählt und der Code ist nur eine Skizze. Ich hoffe, dass das Prinzip trotzdem rübergekommen ist.
 

Neue Themen


Zurück
Oben