mein ziel ist es eine laufende logdatei kontinuierlich auf signalwörter zu untersuchen.
eine gui mit einem toggle-button soll bei aktiviertem toggle die schleife und somit das programm starten und bei erneutem drücke auf dem button die schleife verlassen, bzw unterbrechen.
allerding komme ich aus der schleife nicht raus, bzw. hab ich keine möglichekeit -einmal den button aktiviert- diesen wieder zu deaktivieren. die gui kann nicht mehr benutzt werden. nichtmal das schließen der anwendung geht mehr.
Wenn der Button gedruckt wird darfst du nicht sofort deine Operation starten (denn das blockiert den UI-Thread) sondern du musst deine Operation in einen eigenen Thread auslagern und diesen dann starten. Beim erneuten Druecken des Buttons muss der Thread wieder angehalten werden. Wie das genau geht, dazu gibt es hier im Forum unmengen Beispiele, die Foren-Suche hilft dabei weiter.
hab aber mit threads noch nicht gearbeitet. habt ihr ein beispiel-code dafür irgendwo im netz gefunden? hier im forum finde ich nichts zum thema toggle & threads...
Nun brauchen aber sowohl die Gui Informationen von der Control, sowie die Control von der Gui (Eingaben, etc.).
In der Control rufe ich die Gui mit ' Gui gui = new Gui(); ' und in der Gui die Control mit ' Control control = new Control(); '.
Leider hängt sich der Rechner beim starten der Main auf.
Aber das ist doch die einzige Möglichekeit um auf Werte von anderern Klasse zuzugreifen, oder?
Auch stürzt das Programm ab, wenn ich die 'new Gui(); ' enferne. Dann steht da nur 'Gui gui;' Zwar kann ich zwar mit 'gui.' auf die jeweiligen Methoden der Gui zugreifen, aber beim Ausführen bekomme ich eine Fehlermeldung: NullPointerException'.
Du darfst nicht immer neue Objekte anlegen sondern musst mit Referenzen arbeiten.
Beispiel
Code:
public class Control
{
private Gui gui;
public Control()
{
gui = new Gui(this);
}
}
public class Gui
{
private Control control;
public Gui(Control control)
{
this.control = control;
}
}
public class Main
{
public static void main(String[] args)
{
Control c = new Control();
}
}
Bei dem Beispiel ist aber zu beachten, dass man nicht zuviel Funtionalitaet in den Komnstrktor packt, die Klasse Gui bekommt in Zeile 16 zwar ein Objekt vom Typ Control uebergeben, dieses ist aber in dem Moment noch nicht vollstaendig initialisiert.
Ah gut.
Wie heißt dieses Konzept und verhält sich das mit z.B. 10 Klassen, die jeweils untereinanderer kommunizieren ebenfalls ähnlich? Muss ich also für jede Klasse auf die ich zugreifen möchte, einen Konstruktor schreiben?
Und wenn ich -wie im Beispiel- von der Klasse Control auf einer Methode der Gui zugreifen möchte, z.B. getZahl()? Funktioniert das dann mit gui.getZahl() ohne einen Fehler zu produzieren?
Du musst nich alles im Konstruktor machen, sondern du kannst auch einfach mit Controller.setGue(Gui gui) die Gui nactraeglich setzen.
Man solte aber definitv ueberlegen, welche Klassen voneinander abhaengen muessen (eigenltich haengen die Objekte voneinander ab). Unnoetige Abhaengigkeiten sind zu vermeiden.
Zu deiner zweiten Frage: warum sollte es nicht gehen? Wenn ein Controll eine Referenz auf eine Gui haelt, dann kann das Controll auch gui.getZahl() aufrufen, solange diese Methode public ist.