# Hauptthread anhalten / Unterschied zwischen Main-Thread und dialogelement-Thread



## goeoe (7. Okt 2009)

Hallo, ich will ähnlich wie in der Klasse JOptionPane eine klasse mit statischen methoden erstellen,die es dem benutzer erlauben eingaben zu machen. Allerdings soll dazu kein fenster erstellt werden, sondern alle nötigen eingabeButtons, Textfields usw werden im Hauptfenster angezeigt, dafür soll die statische Methode nicht zuständig sein. Dazu muss ich den Haupthread anhalten. Ich hab um die theoretische Funktionsweise zu verdeutlichen mal ein möglichst kurzes Beispiel gemacht, besteht aus 2 Klassen: einmal das Hauptfenster:

```
package fuersForum;


import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MainWindow extends JFrame implements ActionListener {

	private JTextField field;
	private JButton okButton;
	
	public MainWindow() {
		super();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLayout(new GridLayout(5,5));
		setSize(200,400);
		field = new JTextField();
		add(field);
		okButton = new JButton("ok");
		add(okButton);
		
		JButton startButton = new JButton("start");
		startButton.addActionListener(this);
		add(startButton);
		setVisible(true);
	}	
	
	public void testGetString() {
		System.out.println(GetString.getString(field, okButton));
	}

	public void actionPerformed(ActionEvent e) {
		testGetString();
	}	

	public static void main(String[] args) {
		MainWindow mainWindow = new MainWindow();
		mainWindow.testGetString();
	}
}
```
Dann noch die Klasse mit der statischem Methode, um die es eigentlich geht:

```
package fuersForum;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JTextField;

public class GetString implements ActionListener {
	private static String s;
	private JTextField field;
	private static boolean sleep;
	
	public static String getString(JTextField field, JButton button) {
		new GetString(field, button);
		sleep = true;
		while (sleep) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
			}
		}
		return s;
	}
	
	public GetString(JTextField field, JButton button) {
		this.field = field;
		button.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent e) {
		s = field.getText();
		sleep = false;
		((JButton) e.getSource()).removeActionListener(this);
	}
}
```

Das Beispiel zeigt meinen bisherigen erfolg und mein Problem: die zu testende methode wird sofort in der Main-Methode aufgerufen, da klappt auch alles wunderbar wie geplant. Rufe ich jedoch hinterher die Methode mit dem Start-Button auf, so hängt sich das ganze Programm auf. Woran liegt das? Wie unterscheiden sich dei beiden Threads? Ich will wie gesagt kein neues fenster öffnen, also bitte kommt mir nicht mit JDialog oder so was

Vielen Dank im vorraus, Florian


----------



## SlaterB (7. Okt 2009)

der main-Thread ist nicht der AWT-Thread, der der GUI steuert,

der AWT-Thread startet aber alle Listener, wenn darin längerfristiger Code steht, friert die GUI ein
->
aus Listenern neue Threads starten für längere Aktionen


----------



## goeoe (7. Okt 2009)

Vielen dank für die sensationell schnelle Hilfe, habs zum laufen gebracht


----------

