Threads Thread aus verschiedenen Klassen ansprechen

lyjlq

Mitglied
Hallo Forum,

ich versuche grade ein Log Fenster zu erstellen. Dieses soll sich ständig Aktualisieren. Dafür habe ich ein Thread erstellt was ein Fenster erstellt und die ganze zeit auf Daten wartet.

In der Klasse LogMonitor erstelle ich das Fenster und mit der Methode updateLog wird die Anzeige mit neuen Daten bestückt und Aktualisiert.

Java:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class LogMonitor extends JFrame 
{
	private static final long serialVersionUID = -7558310302119076680L;
	private JPanel logPanel = new JPanel();
	private JTextArea logText = new JTextArea();

	public LogMonitor(Boolean logAn) {
		super("Log Monitor");
		this.setBounds(600, 600, 400, 200);
		this.add(mainPanel());
		this.setVisible(logAn);
	}
	private JPanel mainPanel() {
		JPanel mainWindowPanel = new JPanel();
		mainWindowPanel.setLayout(new BorderLayout());
		mainWindowPanel.add(BorderLayout.CENTER,mainLogPanel());
		return mainWindowPanel;
	}
	private JScrollPane mainLogPanel() {
		JScrollPane scroll = new JScrollPane(logPanel);
		scroll.setCorner( JScrollPane.UPPER_RIGHT_CORNER, new JLabel("1", JLabel.CENTER));
		scroll.setCorner( JScrollPane.LOWER_RIGHT_CORNER, new JLabel("2", JLabel.CENTER));
		logText.setTabSize(80);
		logText.setWrapStyleWord(true);
		logText.setText("Start vom Log "+"\n");
		logPanel.add(logText);
		return scroll;
	}
	public void updateLog(String log) {
		logText.append(log);
		logText.append("\n");
		logPanel.repaint();
		System.out.println("was macht updateLog: "+log);
	}
}

In der Klasse LogController ist der Thread unter gebracht und alles um ihn Sichtbar und neue Texte die im Fenster angezeigt werden sollen gesetzt.

Java:
public class LogController implements Runnable
{
	  private String messageText = "Kassenbuch log Start.";
	  private Boolean logAn = false;
	  private Boolean logEnde = false;
	  private LogMonitor log = new LogMonitor(logAn);

	  public void setUpdateLog(String newText) {
	    messageText = newText;
	    log.updateLog(messageText);
	  }

	  public String getUpdateLog() {
	    return messageText;
	  }
	  
	  public void setLogAn(Boolean logAn) {
		  this.logAn = logAn;
		  log.setVisible(this.logAn);
	  }
	  
	  public Boolean getLogAn() {
		  return this.logAn;
	  }

	  public void run() {
		  do {
			  log.updateLog(this.getUpdateLog());
		  	  }
		  while (logEnde);
	 }
}

Und jetzt mein Problem: Wie kann ich das Laufende Thread aus x Klassen ansprechen um die Texte zu übergeben die im Fenster angezeigt werden sollen ohne das ich in jeder Klassen den LogContoller neu zu definieren und somit für jeder Klasse ein neues Thread mit neuen Fenster auf zu machen um die Texte aus dieser Kasse zu sehen.???:L

Unter Welchen Stichworten oder Links kann ich was nachlesen:rtfm:, oder Lösungsansatz.:bahnhof:

Danke
Gurß
LYJLQ
 
Zuletzt bearbeitet von einem Moderator:
Ich verstehe nicht, warum dein Log-Fenster nen eigenen Thread braucht. Würde nen Singleton-Logger schreiben wo alle Klassen dann ihren Senf direkt abgeben können ohne dass der thread ständig nachfragen muss.
 
jedes Objekt, welches x andere kennen sollen, muss an diese x übergeben werden,
oder etwas unsauber einfach statisch allgemein verfügbar sein,
so wie jeder System.out kennt um dort Methoden wie println() aufzurufen

das steht kaum als eigenes Thema in einem Buch, das ist eher etwas was man allgemein im Leben lernt 😉
 
Hallo Robokopp,

Danke für deine Antwort (auch an die beiden Anderen).
Ich glaube das ist alles noch was zu hoch für mich, weil ich anscheinend noch nicht versanden habe, was bei solchen Konstrukten passiert.

Java:
private static DestinationInterface destClass = null;

[TIPP]Das Stammt aus dem Beispiel was Robokopp im Tutorial hinterlegt hat.
Aus der Kalsse DataHandler[/TIPP]

Was zum Teuffell passiert da. Das verstehe ich nicht.

private :es ist nur Lokal zu sehen.
static :es ist für alle erreichbar?
DestinationInterface :warum ist das Namensgleich mit dem Interface
Greift es auf das Interface zu? Wie Warum?????
Wird das Interfache damit für alle sichtbar?
destClass = null : einer Variablen wird „null“ zugewiesen?

Ich hatte das Interface so verstanden, das es als Vorlage dient, damit man keine Metohde vergisst in der Klasse wo man das Interface Implementier. Die im Interface hinterlegten Metohden haben keinen Body.

Was hat eine abstacte Metohde in einem Interface zu suchen, da man ja keinen Body erstellen darf.
Und wieso wird Data wo ja rein nichts gemacht wird importiert. Oder greift die abstracte Metohde setData auf Data zu.

Wird den im in der lehren Klasse Data die Daten abgelegt. In diesen fall „null“?

Was habe ich im Prinzip richtig von Java verstanden.
Wo sind meine Lücken damit ich das verstehen kann.

Gruß

LYJLQ
 
Zuletzt bearbeitet:
Java:
private static DestinationInterface destClass = null;

Ich hatte das Interface so verstanden, das es als Vorlage dient, damit man keine Metohde vergisst in der Klasse wo man das Interface Implementier. Die im Interface hinterlegten Metohden haben keinen Body.

Ja du hast das Interface schon richtig verstanden.
Kleines Beispiel:
Java:
public class PlaceHolder
{
    public static Saving saver = null;
}

public interface Saving
{
    void save();
}

public class DatabaseSaver implements Saving
{
   public void save()
   {
      //schreibe in die Datenbank
   }
}

public class FileSaver implements Saving
{
   public void save()
   {
      // schreibe ins file
   }
}

Java:
...
PlaceHolder.saver.save();
...

Du kannst so sicher sein, jedes Objekt welches du "saver" zuweißt bietet die Methode "save" an.
Was dann die Methode macht, ist Sache des jeweiligen Objekts
 
Zuletzt bearbeitet von einem Moderator:
du hast komplizierten GUI-Code u.a. mit
> private JPanel logPanel = new JPanel();

aber
> private static DestinationInterface destClass = null;
ist jetzt was völlig neues, ein Buch mit sieben Siegeln?!
null ist nur ein andere Wert als ein Objekt, mal will halt (noch) kein bestimmtes hineinlegen
null Referenz Java Referenzen Java

wenn du static nicht verstehst, dann lasse es doch vorerst weg,
falls alles funktioniert war es wohl nicht so wichtig, falls du ein Problem hast kann man dann überlegen

eine Variablendeklaration mit einem Typ ist ziemlich ziemlich grundlegend..
 
Hallo Robokopp,

Danke für deine Antwort (auch an die beiden Anderen).
Ich glaube das ist alles noch was zu hoch für mich, weil ich anscheinend noch nicht versanden habe, was bei solchen Konstrukten passiert.

Java:
private static DestinationInterface destClass = null;

Was zum Teuffell passiert da. Das verstehe ich nicht.

private :es ist nur Lokal zu sehen.
static :es ist für alle erreichbar?
DestinationInterface :warum ist das Namensgleich mit dem Interface
Greift es auf das Interface zu? Wie Warum?????
Wird das Interfache damit für alle sichtbar?
destClass = null : einer Variablen wird „null“ zugewiesen?

private bedeutet, der Zugriff auf destClass ist nur innerhalb dieser Klasse möglich
static bedeutet, dieses Objekt "destClass" ist immer verfügbar, auch wenn du zuvor kein Objekt von der Klasse DataHandler erzeugt hast. Damit gehe ich sicher, dass die Klasse das Zielobjekt kennt.

Angenommen, dort würde stehen public static Object obj=new Object();
dann könnte ich einfach auf dieses statische Objekt zugreifen per DataHandler().obj, weil dieses obj existiert, auch wenn es kein Objekt von DataHandler gibt. Es liegt also einfach in diesem "Klassencontainer".

Ein anderes Beispiel wäre, wenn du zählen willst, wieviele Objekte einer Bestimmten Klasse erzeugt wurden.Dafür legst du einfach in der Klasse eine statische Countervariable an und zählst im Konstruktor um 1 hoch. Diese eine Variable existiert so für jedes Objekt.

das null hätte ich genauso gut weglassen können, denn solange destClass noch kein Objekt zugewiesen wurde, ist es automatisch Null.

Ich hatte das Interface so verstanden, das es als Vorlage dient, damit man keine Metohde vergisst in der Klasse wo man das Interface Implementier. Die im Interface hinterlegten Metohden haben keinen Body.

Was hat eine abstacte Metohde in einem Interface zu suchen, da man ja keinen Body erstellen darf.
Und wieso wird Data wo ja rein nichts gemacht wird importiert. Oder greift die abstracte Metohde setData auf Data zu.

Mit Interfaces will man sichergehen, dass eine Klasse die gewünschten Methoden einer Schnittstelle auch garantiert implementiert. Das Interface sorgt in dem Fall dafür, dass deine Zielklasse garantiert eine setData(Data data) Methode enthalten wird. Daher auch die Variable private static DestinationInterface destClass=null;

Damit muss das Zielklassenobjekt, dass an die HandlerKlasse übergeben wird auf jeden Fall das Interface implementiert haben, sonst geht es nicht.

Das abstract kann man wegmachen.
Kann sein dass das vorher kein Interface sondern eine abstrakte Klasse war und ich dann auf die Idee gekommen bin dass vielleicht die Zielklasse schon von irgendwas anderem erbt, beispielsweise JPanel. Ja ich glaub so war es.
 
Danke an alle,

SlaterB hat gesagt.:
du hast komplizierten GUI-Code u.a. mit
> private JPanel logPanel = new JPanel();

Handbuch gelesen verstehen Nachvollziehen Begreifen. Es hat Klick gemacht (Hoffendlich richtig).

SlaterB hat gesagt.:
private static DestinationInterface destClass = null;
ist jetzt was völlig neues, ein Buch mit sieben Siegeln?!

Jedes einzelne teil im Handbuch gelesen :rtfm: verstanden und Nachvollzogen Begreifen.
So eine Kombination habe ich nie in den Handbüchern wahrgenommen. ???:L

destClass = null : einer Variablen wird „null“ zugewiesen?

Hier habe ich wohl ein ? zufiel gesetzt. :autsch:

Pippl hat gesagt.:
Ja du hast das Interface schon richtig verstanden.
Kleines Beispiel:

Und es macht aaaaahhhh, aber wie kann man DatabaseSaver oder FilesSaver den jetzt ansprechen,
so das sie ausgeführt werden? 🙁
 
irgendjemand legt ein richtiges Objekt in die Variable, welcher Art ist egal,
der Aufruf der save()-Methode geht dann, wird intern korrekt zum Objekt, zur Klasse, zum Code der richtigen save-Methode weitergeleitet
 
irgendjemand legt ein richtiges Objekt in die Variable, welcher Art ist egal,
der Aufruf der save()-Methode geht dann, wird intern korrekt zum Objekt, zur Klasse, zum Code der richtigen save-Methode weitergeleitet

Hi SlaterB,

schön gesagt. Aber irgendwie scheine ich auf einen Abstellgleis gelandet zu sein.:bahnhof:

Also ich nehme FileSaver und will das es nur txt Ausgeben soll.
Java:
	   System.out.println(txt);

Von welchen Objekt und Variable redest Du wie werden die Angesprochen.
Ich denke (kann ich das?), ich ahne wie das läuft.
Aber ich habe keine Idee wie der Syntax aus sehen kann. :bahnhof:
 
Methoden werden an Objekten aufgerufen,
von der Klasse FileSaver ein Objekt zu erstellen usw. ist der normale Standardfall, da kann es wohl keine Frage geben,
(ist bisher natürlich nur ein abstraktes Beispiel, kein Code vorhanden, kein Paramete für txt vorhanden usw.)

du kannst das FileSaver-Objekt aber auch in der Variable vom Typ des Interfaces ablegen,
und dann immer noch save() aufrufen, ohne (bei dieser Variable) zu wissen, welche Klasse genau es ist,

durch das Interface ist sichergestellt dass die Methode vorhanden ist, also ist sie aufrufbar, fertig
 

Zurück
Oben