Übergabe von Variablen an Threads

MeRo113

Grünschnabel
Hey zusammen,
bin gerade dabei ein kleines Tool zu schreiben in dem sich mehrere JPannel aktualisieren und durch Unterbrechungen von Thread.sleep eine Art "Animation" entsteht. Nur ist das mit dem sleep nicht ganz so leicht...
Wenn ich das sleep direkt in der Funktion benutze wo die JPanel gefüllt werden sehe ich nur den Endzustand und nicht die einzelnen Zwischenschritte. Dank Onkel Google bin ich jetzt schon soweit dass ich weiß, dass ich mehrere Threads brauche, einen für das sleep und einen für das Zeichnen. Das klappt inzwischen auch wunderbar. Die beiden Threads laufen parallel, nur kriege ich es nicht hin in dem neu erzeugten Thread der das sleep beinhaltet Variablen zu übergeben. Ausgaben via Syso klappen wunderbar aber ohne das JPanel Objekt kann ich halt nichts darauf zeichnen.
Nun zu meiner Frage, wie übergebe ich einem neuen Thread Variablen? Habe bei meiner Suche nach einer Lösung schon mehrere Ansätze gesehen den Thread zu implementieren, grundsätzlich lief es auf 2 verschiedene Möglichkeiten heraus, eine neue Klasse die von Runnable ableitet, damit hatte ich leider garkeinen Erfolg. Und einen neuen Thread innerhalb der vorhandenen Klassen der die oben genannten Ausgaben lieferte.

Hier mein bisheriger Code:
Code:
package hsd;

IMPORTS

@SuppressWarnings("serial")
public class GUI extends JFrame {
	public JPanel     _mainMenuePanel        = null;
	public JPanel     _simulationPanel       = null;
	public JPanel     _simulationPanelBackup = null;
	public JPanel     _dataEntryPanel        = null;
	public JPanel     _outputPanel           = null;
	public DataEntry  _dataEntryObject       = null;
	public Simulation _simulationObject      = null;
	public Logic      _logicObject           = null;
	
	GUI() {
		setTitle("Hide and Seek");
		...
		ActionListener startButtonActionListener = new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				mainMenueStartButtonAction(e);
			}
		};
	}
	
	public void initiate() {
		INITIALISIERUNG DES JPANEL MIT ACTION LISTENERN UND CO
	}

    ...
	
	public static void main(String[] args) {
		GUI g = new GUI();
	}
	
	public void mainMenueStartButtonAction(ActionEvent e) {
		_logicObject.start();
	}
}

Code:
package hsd;

IMPORTS

public class Logic {
	public GUI        _guiObject        = null;
	public DataEntry  _dataEntryObject;
	public Simulation _simulationObject = null;
	public int init = 0;
	
	Logic(GUI guiObject) {
		INITIALISIERUNGEN
	}
	
	public void start() {
        ...
		
		_simulationObject.init(xSize, ySize);

		...
		
		Thread logicThread = new Thread() {
			public void run() {
				## HIER BRÄUCHTE ICH DIE VARIABLEN, _guiObject z.B. ##
				for (int i = 0; i < 10; i++) {
					System.out.println(i);
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		logicThread.start();
	}
}

Hoffe der Code reicht zur Verständnis und enthällt nicht zu viel Müll. An der gekennzeichneten Stelle im logicThread bräuchte ich die Variablen damit ich dann von dort auf die JPanels füllen könnte. Egal ob ich es im new Thread oder in der Run angebe dass dort Parameter übergeben werden, es gibt immer wieder Fehler. Kann mir da vlt jemand helfen und verraten wie das gehen soll?


Vielen Dank im Vorraus

Gruß MeRo
 

Fabio Hellmann

Erfahrenes Mitglied
Hi,

bevor ich zu deiner eigentlichen Frage komme, ist mir aufgefallen, dass du all deine Variablen global (public) gemacht hast. Das ist so ziemlich das komplette Gegenteil von OOP. Versuche dir anzugewöhnen, die Variablen immer private oder protected zu machen und dann mit Get- und Settermethoden zu arbeiten.

Nun zu deinem Problem. Wenn ich das richtig verstanden habe, willst du eine Animation in einem JPanel durchführen. Hierfür brauchst du nicht mehr als 2 Threads. 1 Thread in dem die Swing-Oberfläche läuft und 1 Thread der das neuzeichnen und aktualisieren der Objekte vornimmt.
Ich habe selbst schon ein JAnimationPanel entwickelt. Dazu habe ich außerdem auch ein Tutorial geschrieben, welches du HIER finden kannst. ;)
Du musst den Code nicht gleich kopieren, aber als kleine Hilfestellung ist es allemal geeignet. Und lauffähig ist mein Code auch, sodass du dir auch gerne das Beispiel runterladen kannst und mal ausführen. :)

Gruß

Fabio
 

MeRo113

Grünschnabel
Hey Fabio,
danke für deine Hilfe. Habs gerade mal überflogen da ich nicht so viel Zeit habe, sieht recht komplex aus, hoffe ich komme damit klar *g*
Werde mich die Tage mal dran setzen wenn ich etwas mehr Zeit habe.

Schonmal vielen Dank,
Gruß

MeRo

edit:
Hey,
habe jetzt die letzten Tage das Tutorial mal genau durchgearbeitet und mir viel Zeit genommen, jetzt läuft alles. Habe es relativ ähnlich dem Tutorial dann bei mir eingebaut.

Nochmal vielen Dank für die Hilfe @ Farbio.


Gruß
MeRo