Threads GUI über Hintergrund-Thread aktualisieren

renwal

Aktives Mitglied
Hallo!

Ich hab mal eine Frage zu folgenden Problem: Ich hab ein GUI, auf dem man eine Art Quiz machen kann. Dazu muss man zuerst ein paar Dinge einstellen, dann wird eine Liste mit Fragen generiert und das Quiz startet. Jetzt kann der Benutzer die Frage beantworten und auf OK klicken. Dann soll die nächste Frage aus dem Fragen-Array in das GUI geladen werden.

Den Weg, die Frageliste und einen Zähler global in der Klasse zu definieren und dann beim Klick auf den OK-Button immer eins weiter zu zählen, wollte ich vermeiden. Dann habe ich ja nur unnötige Objekte, wenn das Quiz gar nicht läuft. Da das Programm noch einiges mehr kann, summiert sich das irgendwann.

Stattdessen wollte ich einen Thread erstellen, der die Liste mit Fragen aufnimmt und sich so lange schlafen legt, bis der OK-Button angeklickt wird, die GUI-Aktualisierung ausführt und sich wieder schlafen legt. Mein erster Versuch war der mit
Code:
wait()
und
Code:
notify()
, das habe ich aber bald wieder aufgegeben und es mit
Code:
ReentrantLock
und
Code:
Condition
versucht. Da jetzt aber der Hintergrund-Thread in einer anderen Klasse liegt als das GUI kann ich nicht auf das Condition-Objekt zugreifen, ohne es
Code:
public static
zu machen. Da man aber ja keine Instanzen von außen modifizieren soll, bliebe nur der Weg über einen setter, dessen Aufruf von außen den wartenden Thread dann doch aber mit einer InterruptedException abwürgen würde, bevor er
Code:
condition.signal()
ausführen kann, oder?

Kann mir da jemand einen Lösungsansatz geben?
 
V

vanny

Gast
Also wenn du eine Liste mit Fragen hast, welche nacheinander gestellt werden sollen, wo sind denn da bitte die unnötigen Objekte????:L
Ich glaube es ist unnötig, sich solche Feldversuche anzutun, wie du es da versuchst.

Was machst du denn da so unglaubliches mit deinem Programm, dass es nicht mal eine Liste mit Fragen halten darf?
 

DougUndPizza

Mitglied
Stattdessen wollte ich einen Thread erstellen, der die Liste mit Fragen aufnimmt und sich so lange schlafen legt, bis der OK-Button angeklickt wird, die GUI-Aktualisierung ausführt und sich wieder schlafen legt.

Hallo,

ich versteh nicht so richtig, was dann der Sinn des seperaten Threads ist. Wenn er erst in Aktion tritt, wenn der Button geklickt wird, muss der Benutzer ja sowieso warten, bis die Darstellung aktualisiert ist, um weitermachen zu können. - Also könnte man das direkt synchron machen. Wenn es dir in erster Linie darum geht, die Darstellungslogik von der Fragensammlung zu trennen, würde ich das vielleicht so in der Art machen:


(Beim Button klick wird loadNextQuestion() aufgerufen)

Java:
public class GUITest {

	QuestionsKlasse questionsKlasse;
	
	
	public void setDisplayedQuestion(final String question)
	{
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				this.questionTextField.setText(question);
				
			}
		});
	}
	
	public void loadNextQuestion()
	{
		questionsKlasse.loadNextQuestion();
	}

Java:
public class QuestionsKlasse {

	GUITest gui;
	List<String> questions;
	
	public void loadNextQuestion() {
		
		String currentQuestion = questions.remove(0);
		gui.setDisplayedQuestion(currentQuestion);
	}

}

Ansonsten hilft dir vielleicht das MVC Modell
 

DougUndPizza

Mitglied
Achso, vielleicht war deine Intention bei dem seperaten Thread, dass die GUI nicht hängt, wenn das laden länger dauert.
Dann könntest du beim Aufruf einen Worker Thread starten:


Java:
	public void loadNextQuestion()
	{
		Thread worker = new Thread(new Runnable() {
			
			@Override
			public void run() {
				questionsKlasse.loadNextQuestion();
				
			}
		});
		worker.start();
	}

Oder über SwingWorker, Thread Pool
 
Zuletzt bearbeitet:

DougUndPizza

Mitglied
Irgendwie gefällt mir dein ursprünlicher Ansatz jetzt auch, da man so nicht immer neue Threads starten muss.
Würde das dann in etwa so machen:


Java:
public class QuestionsLoaderJob implements Runnable 
{

	GUITest gui;
	List<String> questions;
	boolean goOn;

	@Override
	public void run() 
	{
		while (goOn) 
		{
			String currentQuestion = questions.remove(0);
			gui.setDisplayedQuestion(currentQuestion);
			synchronized (this) 
			{
				try 
				{
					wait();
				} 
				catch (InterruptedException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	public void loadNextQuestion() 
	{
		synchronized (this) 
		{
			notify();
		}
	}
}

Alle Beispiele sind nicht lauffähig und stark vereinfacht, um die Sache auf den Punkt zu bringen.

Poste doch mal, was du bis jetzt hast und was nicht funktioniert.
 
B

bygones

Gast
Also wenn du eine Liste mit Fragen hast, welche nacheinander gestellt werden sollen, wo sind denn da bitte die unnötigen Objekte????:L
Ich glaube es ist unnötig, sich solche Feldversuche anzutun, wie du es da versuchst.

Was machst du denn da so unglaubliches mit deinem Programm, dass es nicht mal eine Liste mit Fragen halten darf?

das ist die richtige Antwort im Grunde.... Threads scheinen hier ein wenig sehr weit hergeholt.
 

renwal

Aktives Mitglied
Ihr habt wohl recht. Ich wollte halt einfach nicht Unmengen an Objekten erzeugen, die dann unbenutzt "rumliegen" wenn sich das Programm in einem anderen Modus befindet. Da dachte ich halt, wenn ich am Ende den Thread beende, dann bin ich auch das Objekt los. Wenn ich die Liste in der Hauptklasse definiere, geht das nicht, ich kann ja nicht die Hauptklasse beenden. Das Programm zieht halt mit jedem Objekt mehr auch mehr Speicher. Da das ganze Projekt recht aufwändig ist, wollte ich eben Speicher sparen.

DougUndPizza hat gesagt.:
Achso, vielleicht war deine Intention bei dem seperaten Thread, dass die GUI nicht hängt, wenn das laden länger dauert.
Dann könntest du beim Aufruf einen Worker Thread starten:

Nein, war es nicht. Das habe ich schon vorher über einen Worker Thread gemacht, so wie du es geschrieben hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen GlassPane über JScrollPane legen Java Basics - Anfänger-Themen 6
A Server - Client Nachrichtenaustausch über Eventbus Java Basics - Anfänger-Themen 12
P Neue Java v8 JRE Version nicht über alte drüber installierbar: Wie sonst? Java Basics - Anfänger-Themen 7
D Downloadfortschritt von Datei über Google Drive API v3 Java Basics - Anfänger-Themen 10
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
S Java über SSH Java Basics - Anfänger-Themen 13
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
D Best Practice Ausgabe über direkte Ausgabe oder try-catch? Java Basics - Anfänger-Themen 13
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
W char über die Konsole? Java Basics - Anfänger-Themen 7
EchtKeineAhnungManchmal Hallo :) ich bekomme es nicht hin eine Fehlermeldung auszugeben über die GUI Java Basics - Anfänger-Themen 3
S Array über ein Ausgabemethode in main ausgeben Java Basics - Anfänger-Themen 31
C Potenzberechnung über switch case. Taschenrechner mit Eingabe über einen grafischen Dialog Java Basics - Anfänger-Themen 22
J Wert zurückgeben über get Methode Java Basics - Anfänger-Themen 8
J Eintrag Combobox über einen String auswählen Java Basics - Anfänger-Themen 3
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Java über cmd benutzen ? Java Basics - Anfänger-Themen 5
J Variablenzugriff über string Java Basics - Anfänger-Themen 18
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
M Java Kompilieren über Package grenzen hinaus Java Basics - Anfänger-Themen 4
M Arrays mit mehreren Werten über JOptionPane initialisieren Java Basics - Anfänger-Themen 12
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
J Array über Getter erlangen Java Basics - Anfänger-Themen 34
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
B OOP-Anfänge über CMD + Editor Java Basics - Anfänger-Themen 30
G Variablen Array Länge über den Konstruktor definieren Java Basics - Anfänger-Themen 4
L Addition von Arrays über die Parameterliste Java Basics - Anfänger-Themen 11
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
1 Erste Schritte Was denkt ihr über eines meiner ersten Javaprogramme? Java Basics - Anfänger-Themen 2
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
N Eingabe Kommazahlen über Scanner Java Basics - Anfänger-Themen 2
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
J Gefilterten Stream über die Konsole ausgeben Java Basics - Anfänger-Themen 1
S Variablen Klassenvariable über Objekt aufrufen Java Basics - Anfänger-Themen 16
S Bilder über Socket Senden Java Basics - Anfänger-Themen 1
K Textdatei auslesen und über Mqtt schicken Java Basics - Anfänger-Themen 4
L Iterieren über eine CSV Datei Java Basics - Anfänger-Themen 7
I GUI über Eclipse oder NetBeans Java Basics - Anfänger-Themen 23
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
O Methode über Leerzeichen Java Basics - Anfänger-Themen 13
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
A Variablen Variablenwert über Konstruktor ändern Java Basics - Anfänger-Themen 3
J MySQL Datumsabfrage über ResultSet in Java-Servlet Java Basics - Anfänger-Themen 4
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
R Keine Verbindung zu MySql über Netbeans Java Basics - Anfänger-Themen 15
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Aufruf einer Methode über einen String Java Basics - Anfänger-Themen 11
G Arraynamen über eine Schleife ansprechen Java Basics - Anfänger-Themen 4
S Bild über JButton legen Java Basics - Anfänger-Themen 3
temi Druckeransteuerung über ESC-Sequenz Java Basics - Anfänger-Themen 21
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
B Könnte jemand über dieses jurze Javaprogramm schauen? Irgendwas funktioniert mit der z-Varible nicht Java Basics - Anfänger-Themen 2
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
E Wie Passwort-Eingabe (ohne Echo!) über Konsole ? Java Basics - Anfänger-Themen 4
C Erste Schritte Fehler beim *.class Aufruf über cmd.exe Java Basics - Anfänger-Themen 9
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
P Threads Prozess kann nicht über die GUI gestartet werden Java Basics - Anfänger-Themen 8
T CMD über Java-Programm aufrufen Java Basics - Anfänger-Themen 2
X Finde die Files über FTP nicht Java Basics - Anfänger-Themen 4
J Methode über Scanner aufrufen Java Basics - Anfänger-Themen 15
P Programm kann über CMD nicht ausgeführt werden Java Basics - Anfänger-Themen 2
E Frage über Speichern und Ausgabe Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
X Betriebssytem interne Consolen Commands über Java starten Java Basics - Anfänger-Themen 2
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
A .jar über Webbrowser aufrufen Java Basics - Anfänger-Themen 2
D Ausgabe über JLabel Java Basics - Anfänger-Themen 12
L Erste Schritte Arrays über eine for Schleife ansprechen. Java Basics - Anfänger-Themen 6
MiMa Datentyp Short Wert zuweisen über Methode Java Basics - Anfänger-Themen 2
K Objekt soll Anwendung über Änderungen informieren Java Basics - Anfänger-Themen 8
Detox Class Datei erzeugen nicht möglich über cmd Java Basics - Anfänger-Themen 1
F Gewichteter Mittelwert über eine Zeitperiode Java Basics - Anfänger-Themen 3
B Schleife über einen Container Java Basics - Anfänger-Themen 7
Henri Paare Frage über Java Programmierung Java Basics - Anfänger-Themen 10
T jar von stick aus über jre auf stick starten Java Basics - Anfänger-Themen 6
L Iterieren über ArrayList Java Basics - Anfänger-Themen 1
D Java doppelte Zahlen auch über 10 in einem String entfernen Java Basics - Anfänger-Themen 2
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
F Methoden aus anderer classe über nehmen Java Basics - Anfänger-Themen 10
N .propertiesdatei über Relativen Pfad einlesen lassen Java Basics - Anfänger-Themen 5
G Input/Output CSV-Datei über Java-Programm erstellen, Zeichensalat Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben