Threads Swing

chnooorzi

Mitglied
Hallo

Ich habe ein kleines oder auch grosses Problem.
Für die Schule muss ich ein Programm entwickeln, welches auf einem Gridlayout
Roboter (Threads) durch ein GridLayout wandern lassen muss.
Die Roboter werden durch einen Punkt dargestellt.
Wenn ich das Ganze in der Konsole ausgebe funktioniert es einwandfrei.
Sobald ich das Ganze jedoch in einem JFrame anzeigen möchte, funktioniert es
manchmal, meistens aber nicht.

Ich vermute, dass ich irgendwo etwas mit SwingUtilities einbauen muss, weiss aber nicht
wo... Oder habe ich irgendwo anders einen Fehler?
Das Programm gibt automatisch für jeden Thread jeweils den Output auch in der Console aus
(zum Vergleichen).

Im Anhang habe ich eine etwas abgespeckte Version gezippt (ohne Writer und FileReader).

Besten Dank für die Hilfe

Gruss chnooorzi
 

Anhänge

  • Archiv.zip
    6 KB · Aufrufe: 6

Gucky

Top Contributor
Swing hat etwas eingebaut, dass es sich nicht aus einem anderen Threads verändern lässt (klappt nicht immer).
Deshalb musst du die SwingUtilities immer dann einbauen, wenn du schreibend auf einen SwingComponent zugreifen willst.

Java:
SwingUtilities.invokeLater(new Runnable () {//Aus einem Thread heraus darf die GUI nicht verändert werden. Daher muss invokeLater aufgerufen werden, um die Befehle an den Thread der GUI weiterzugeben
	public void run(){
		doStuff();
	}
});

Damit müsste es eigentlich funktionieren. Zumindest hatte ich mal das Problem, dass zwar keine Fehlermeldung ausgegeben wurde, aber einfach nichts passiert ist.
 

chnooorzi

Mitglied
Hallo

Danke für die rasche Antwort.
MIr ist leider noch ein wenig unklar wo ich das einbauen muss...

Ich habe die folgenden Klassen:
- RobotGameViewer
- RobotGameFrame extends JFrame
- GameField
- RobotRunnable: extends Runnable
- Field: extends JPanel
- CircleComponent: extends JComponent

Zu Beginn erstelle ich ein JFrame mit
JFrame frame = new RobotGameFrame(new Gamefield());

Das Gamefield ist ein Array welches aus mehreren Feldern (JPanel) besteht
Im Frame wird dieses Array dann in ein GridLayout geladen, in dem die einzelnen
Felder, welche ja JPanel sind, der Reihe nach eingelesen werden.

Der Roboter ändert eigentlich nur den Status des Feldes von locked (add CircleComponent) auf unlocked (removeAll()) und unbekehrt.

Das heisst ich muss in der createPanel(); Methode bereits SwingUtilities einbauen und zudem
auch noch in der Methode in der die Felder den Status ändern. Habe ich das richtig Verstanden?

Danke

Gruss chnooorzi
 

sirkarpfen

Mitglied
Im Prinzip musst du invokeLater() nur dort verwenden wo du die RoboterThreads erstellst. Das hier is zB. relativer Unsinn, weil das Erstellen eines Frames nicht wirklich was mit einem seperaten Thread zu tun hat, der auf die GUI zugreift:

Java:
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        final JFrame frame = new RobotGameFrame(gamefield);
        frame.setTitle("Robot Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }});

Hier wäre die einzig sinnvolle Verwendung von invokeLater():

Java:
if(!gamefield.getSingleField(column, row).isLocked()) {
    Runnable robotRunnable = new RobotRunnable(gamefield, column, row, new  Color(red,green,blue), DEFAULT_DELAY);
    SwingUtilities.invokeLater(robotRunnable);
    robots.add(new Thread(robotRunnable));
}

Nochmal zur Erklärung, invokeLater() dient nur dazu anderen Threads zu "erlauben" die GUI zu verändern :).
 
Zuletzt bearbeitet:

Gucky

Top Contributor
sirkarpfen hat gesagt.:
Nochmal zur Erklärung, invokeLater() dient nur dazu anderen Threads zu "erlauben" die GUI zu verändern .


Das ist, finde ich, ein bisschen irreführend, da die Befehle nicht mehr im Thread ausgeführt werden, der sie ohne invokeLater aufgerufen hätte, sondern im GUI Thread. Sehr rechenintensive Dinge blockieren dann trotzdem das GUI.

Ich tue das invokeLater immer dort hin, wo auch das GUI verändert wird.
 

chnooorzi

Mitglied
Hallo

Danke für die Antworten.
Im Prinzip musst du invokeLater() nur dort verwenden wo du die RoboterThreads erstellst. Das hier is zB. relativer Unsinn, weil das Erstellen eines Frames nicht wirklich was mit einem seperaten Thread zu tun hat, der auf die GUI zugreift:

Java:
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        final JFrame frame = new RobotGameFrame(gamefield);
        frame.setTitle("Robot Game");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }});

Habe ich so von Oracle übernommen... Hatte das bisher auch nie so gemacht ;)
Wenn ich das so ergänze wie Du es mir geraten hast, funktioniert es nicht. Das Frame bleibt
leer und es wird nur noch ein Roboter bewegt...
Auch wenn ich das oben erwähnte nicht in SwingUtilities packe.

@Gucky Ich habe das invokeLater in der Field-Classe in der Methode changeState hinzugefügt...
DOch leider funktioniert es auch so nicht :(

Ich habe jedoch bemerkt, dass es unter Windows ohne Probleme läuft. Unter Mac OSX Mavericks habe ich das Problem ab 6 Threads...
 

Gucky

Top Contributor
ich weiß nicht, was changeState macht. Eu müsstest das invokeLater dort machen, wo direkt auf der Swing Componente etwas gemacht wird oder in übergeordneten Methoden.

Versuch mal die andere Möglichkeit. Eigentlich hat es auch mit meiner zu funktionieren aber die Andere ist natürlich leichter. ;)
 

chnooorzi

Mitglied
Hallo

Die Methode changeLockedState gehört zur Klasse Field (extends JPanel).
Und macht das folgende:

Java:
	public void changeLockedState(final Color color) {
		locked = !locked;

			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					
					if(locked) add(new CircleComponent(getWidth() / 2, color));
					else removeAll();
					
					revalidate();
					repaint();
				}});		
	}
Sie fügt also zum JPanel einen Circle hinzu oder entfernt ihn.
Wenn ich das Ganze wie oben mache, funktioniert es immer noch einwandfrei unter Windows.
Jedoch unter OSX habe ich immer noch das selbe Problem -.-

Gruss chnooorzi
 

sirkarpfen

Mitglied
Das ist, finde ich, ein bisschen irreführend, da die Befehle nicht mehr im Thread ausgeführt werden, der sie ohne invokeLater aufgerufen hätte, sondern im GUI Thread. Sehr rechenintensive Dinge blockieren dann trotzdem das GUI.

Ich tue das invokeLater immer dort hin, wo auch das GUI verändert wird.

Jo du hast recht, das war wirklich schlecht formuliert. Manchmal versucht man etwas verständlich zu machen und dann kommts doch irreführender raus als man will :).

Wenn ich das Ganze wie oben mache, funktioniert es immer noch einwandfrei unter Windows.
Jedoch unter OSX habe ich immer noch das selbe Problem -.-

Gruss chnooorzi

Was genau funktioniert denn nicht? Gibts Fehlermeldungen oder tuts nicht das was es soll?
 
Zuletzt bearbeitet:

Gucky

Top Contributor
@sirkarpfen
Das Problem kenne ich gut. :D

@TO
Poste mal bitte, wie sirkarpfen schon angedeutet hat, eine vollständige Fehlerbeschreibung. Wird das Ganze überhaupt aufgerufen? Unterstützt das Mac OS X vielleicht kein derartiges Multithreading? Wird vielleicht eine Exception geworfen?
 

chnooorzi

Mitglied
Hallo

Es macht nicht das was es soll...
Eigentlich sollten zu jederzeit 10 Punkte (robots) von feld zu feld springen.
Unter Windows funktioniert das auch. Unter Mac sehe ich zum Teil nicht 10
Punkte und zum Teil sehe ich ein paar Punkte doppelt (diese haben eine
unterschiedliche Farbe).

Die einzelnen Felder sehe ich (die haben einen Border), jedoch werden diese nicht
sortiert. Wenn ich das Ganze in der Konsole ausgebe, funktioniert es.

Gruss chnooorzi
 

chnooorzi

Mitglied
Hallo

Funktioniert jetzt...
Meine Änderungen waren:
- SwingUtilites in der changeState.Methode
- Gamefield extends JPanel
- Und noch ein gamefield.revalidate und gamefield.repaint in der move-methode.

Danke für eure Hilfe!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
S Java Swing GUI mit MVC und Threads AWT, Swing, JavaFX & SWT 6
B Threads in Swing AWT, Swing, JavaFX & SWT 4
R Swing Java Swing Gui und nebenläufige Threads AWT, Swing, JavaFX & SWT 4
R Swing Swing und die Threads AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
A Swing und Threads AWT, Swing, JavaFX & SWT 8
R Swing & Threads AWT, Swing, JavaFX & SWT 4
P Threads und Swing bzw. AWT AWT, Swing, JavaFX & SWT 15
W Swing, 2 JProgressbars und threads geht das? AWT, Swing, JavaFX & SWT 2
K Swing und Threads AWT, Swing, JavaFX & SWT 11
M Threads in Swing? AWT, Swing, JavaFX & SWT 2
V Swing & Threads ??? AWT, Swing, JavaFX & SWT 3
frager2345 Threads -> Ereignisbehandlung AWT, Swing, JavaFX & SWT 2
N jFrame löscht am Ende des Threads alles AWT, Swing, JavaFX & SWT 2
J GUI Ausgaben aus Threads AWT, Swing, JavaFX & SWT 13
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
U JAVAFX observer und threads AWT, Swing, JavaFX & SWT 1
J Textlabel verändern mit parallelen Threads AWT, Swing, JavaFX & SWT 7
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
R Straßenkreuzung - Ampeln mit Threads koordinieren AWT, Swing, JavaFX & SWT 5
Z JavaFX Threads AWT, Swing, JavaFX & SWT 4
T hallo, habe ein Problem mit dem pro. eines Threads AWT, Swing, JavaFX & SWT 4
M Threads - nicht erklärbare Exception AWT, Swing, JavaFX & SWT 6
R Repaint() in Schleifen, Threads AWT, Swing, JavaFX & SWT 13
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
C JTextArea scrollt bei append(String) aus Threads nicht ans Ende AWT, Swing, JavaFX & SWT 7
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
B GUI mit Threads aufbauen AWT, Swing, JavaFX & SWT 5
E Threads Ausgaben in GUI anzeigen lassen AWT, Swing, JavaFX & SWT 14
P JavaFX 2 (2.1 Beta) Threads AWT, Swing, JavaFX & SWT 7
M Problem mit Threads AWT, Swing, JavaFX & SWT 64
S Swing Threads Windows 7 64 bit AWT, Swing, JavaFX & SWT 12
J Threads + JFrame AWT, Swing, JavaFX & SWT 4
R Java threads und synchronized AWT, Swing, JavaFX & SWT 15
N Swing Threads sollen Tabtitel zur Laufzeit ändern AWT, Swing, JavaFX & SWT 4
S Gui und Aufgaben Threads AWT, Swing, JavaFX & SWT 12
M Zugriff paralleler Threads auf selbes JTextPane AWT, Swing, JavaFX & SWT 6
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
B Swing GUI und Threads AWT, Swing, JavaFX & SWT 4
R Korrektes manipulieren der GUI aus anderen Threads heraus AWT, Swing, JavaFX & SWT 19
S Threads und Layout AWT, Swing, JavaFX & SWT 9
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
F Swing Anfängerproblem Threads AWT, Swing, JavaFX & SWT 6
S Swing Threads und das Ändern des Hintergrundes ... AWT, Swing, JavaFX & SWT 2
S Zeichnen in Threads AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWT SWT und Threads AWT, Swing, JavaFX & SWT 5
borobudur SWT SWT-Framework und Threads AWT, Swing, JavaFX & SWT 12
W Threads nacheinander aufführen AWT, Swing, JavaFX & SWT 5
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
S JProgressBar und Threads AWT, Swing, JavaFX & SWT 11
G Probleme mit jList und Threads. AWT, Swing, JavaFX & SWT 3
R 2 Threads nacheinander. Einer terminiert, der andere nicht. AWT, Swing, JavaFX & SWT 9
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
W Threads und trotzdem keine Nebenläufigkeit AWT, Swing, JavaFX & SWT 13
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
N Threads kein neues Fenster erzeugen lassen AWT, Swing, JavaFX & SWT 4
G problem mit threads/repaint ! AWT, Swing, JavaFX & SWT 2
A JTextArea und Threads AWT, Swing, JavaFX & SWT 9
B Probleme mit GUI und Threads AWT, Swing, JavaFX & SWT 17
E repaint(), EDT-Warteschlange und Threads AWT, Swing, JavaFX & SWT 26
S Threads in Java AWT, Swing, JavaFX & SWT 22
G AWT + Threads = nicht gut :P AWT, Swing, JavaFX & SWT 6
F Verständis Problem zu Threads AWT, Swing, JavaFX & SWT 2
M Swinganwendung Threads mit JProgressBar AWT, Swing, JavaFX & SWT 7
V Problem mit Aktualisieren von JList mit Threads AWT, Swing, JavaFX & SWT 3
U FileChooser Layout - Threads? AWT, Swing, JavaFX & SWT 17
R JProgressBar ohne Threads verwenden AWT, Swing, JavaFX & SWT 6
I JList, AbstractListModel und nebenläufige Threads AWT, Swing, JavaFX & SWT 2
S "Millionen" von Threads? Programm komplett beenden AWT, Swing, JavaFX & SWT 2
M Konsolenprg-Ausgabe in GUI geleitet - Brauche ich Threads? AWT, Swing, JavaFX & SWT 2
C Schweres Problem mit JDialog und Threads! Anzeige blockiert! AWT, Swing, JavaFX & SWT 5
N Netzwerk-Applikation, SWT und Threads AWT, Swing, JavaFX & SWT 4
R createBufferStrategy() und Threads AWT, Swing, JavaFX & SWT 5
D Threads unter JFrame AWT, Swing, JavaFX & SWT 2
G Nochmal Threads und Einfrieren des GUI :( AWT, Swing, JavaFX & SWT 10
D Problem mit JProgressBar und Threads AWT, Swing, JavaFX & SWT 7
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben