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:
Dann noch die Klasse mit der statischem Methode, um die es eigentlich geht:
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
Java:
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();
}
}
Java:
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