# Userinput in GUI an externes Programm



## hierUndDa (23. Mai 2011)

Hallo zusammen

Ich habe eine Klasse die vollautomatisch abläuft. Nun ist es jedoch bewusst möglich diese Klasse zu vererben und die Methoden zu überschreiben, die einen Userinput ermöglichen.

Mit der CommandLine ist das ziemlich einfach, da schreibe ich einfach: 


```
@Override
	public boolean getAnswer(String question) {
		System.out.println(question + " (y/n) ");
		
		Scanner scan = new Scanner(System.in);
		String answer = scan.nextLine();
		if (answer.equals("y"))
			return true;
		else 
			return false;
	}
```

Wie aber bewerkstellige ich das in einem GUI? Das GUI ist eigentlich schon erstellt und es hat auch yes/no knöpfe, die ich aktivieren, bzw. deaktivieren kann. In meiner überschriebenen Klasse habe ich zugriff auf mein GUI.


```
@Override
	public boolean getAnswer(String question) {
		String answer = gui.getAnswer();

		if (answer.equals("y"))
			return true;
		else 
			return false;
	}
```

Dann im GUI:


```
public String getAnswer() {
          yes.setEnable(true);
          no.setEnable(true);

          //Halte bis user den button geklickt hat.

           return result;
       }
```

Aber wie bringe ich das Programm dazu zu warten?


----------



## jgh (23. Mai 2011)

da bietet sich ein JDialog an, oder ein JOpitonPane, die sind, bzw. können modal gesetzt werden und warten auf ein OK, eine Eingabe, oder was auch immer.

Java Code im 
	
	
	
	





```
nicht in <java>
```


----------



## hierUndDa (23. Mai 2011)

Ja, das wäre möglich. Nur möchte ich gerne die Buttons verwenden, die bereits auf meiner GUI vorhanden sind. Hier ein vereinfachtes Beispiel, das jedoch nicht korrekt funktioniert, von dem was ich gerne möchte.


```
package examples;

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

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {
	public static void main(String[] args) {
		Gui gui = new Gui();
		Player p = new Player();
		p.start();
		HumanPlayer hp = new HumanPlayer(gui);
		hp.start();
	}
}


class Gui extends JFrame implements ActionListener {

	JButton sandro;
	JButton sandra;
	boolean result;
	String answer = null;
	
	public Gui() {
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		sandro = new JButton("sandro");
		sandra = new JButton("sandra");
		sandro.addActionListener(this);
		sandra.addActionListener(this);
		sandro.setEnabled(false);
		sandra.setEnabled(false);
		this.add(panel);
		panel.add(sandro);
		panel.add(sandra);
		this.setSize(300, 300);
		this.setVisible(true);
	}
	
	public String askForName() {
		sandro.setEnabled(true);
		sandra.setEnabled(true);
		
		//Warten bis Klick von User??
		while(result == false) { }
		//??
		
		result = false;
		return answer;
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		answer = arg0.getActionCommand();
		sandro.setEnabled(false);
		sandra.setEnabled(false);
		result = true;
	}
}

class Player {
	private String name;
	
	public void start() {
		name = askForName();
		System.out.println("Your name is " + name);
	}
	
	protected String askForName() {
		return ("Bernhard");
	}
}

class HumanPlayer extends Player {
	
	Gui gui;
	
	public HumanPlayer(Gui gui) {
		this.gui = gui;
	}

	@Override
	protected String askForName() {
		return gui.askForName();
	}
}
```


----------



## hierUndDa (23. Mai 2011)

Schreibt man die Methode askForName() in der Klasse Gui folgendermassen, dann funktioniert es. Aber schön ist das nicht, oder?


```
public String askForName() {
		sandro.setEnabled(true);
		sandra.setEnabled(true);
		
		while(result == false) { 
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		result = false;
		return answer;
	}
```


----------



## Gast2 (24. Mai 2011)

erbt doch einfach von *JDialog*


```
class Gui extends JDialog ... {

    public GUI()
    {
         super(true);
         initDialog();
         ...
    }
}
```


```
public askForName()
{
    GUI g = new GUI();
    g.setVisible(true);
    // hier erst geht es erst weiter wenn der Dialog geschlossen wurde
    ....
}
```


----------



## jgh (24. Mai 2011)

ich weiß nicht, was du da machen willst...aber so kann man bspw. den Namen abfragen und dann wo auch immer ausgeben. Hier gebe ich den eingegebenen Namen auf einem Button und in der konsole aus.
Ist auch nicht sonderlich gut...aber wie heißt es so schön: quick and dirty^^


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

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class Test {
	public static void main(String[] args) {
		Gui gui = new Gui();
		Player p = new Player();
		p.start();
		HumanPlayer hp = new HumanPlayer(gui);
		hp.start();
	}
}

public class Gui extends JFrame implements ActionListener {
	Gui gui;
	JButton sandro;
	JButton sandra;
	boolean result;
	String answer = null;

	public Gui() {
		gui = this;
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		sandro = new JButton("Wer bist du?");
		sandra = new JButton("sandra");
		sandro.addActionListener(this);
		sandra.addActionListener(this);
		sandro.setEnabled(false);
		sandra.setEnabled(false);
		this.add(panel);
		panel.add(sandro);
		panel.add(sandra);
		this.setSize(300, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		this.setVisible(true);
	}

	public String askForName() {
		sandro.setEnabled(true);
		sandra.setEnabled(true);

		// Warten bis Klick von User??
		while (result == false) {
		}
		// ??

		result = false;
		return answer;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// answer = arg0.getActionCommand();
		// sandro.setEnabled(false);
		// sandra.setEnabled(false);
		// result = true;
		if (arg0.getSource() == sandro) {
			final JDialog jd = new JDialog();
			jd.setModal(true);
			jd.setSize(200, 200);
			jd.setLocationRelativeTo(gui);
			jd.setLayout(new FlowLayout());
			final JTextField tf = new JTextField(10);
			JLabel l = new JLabel("Geben Sie ihren Namen ein");

			jd.add(l);
			jd.add(tf);
			JButton jb = new JButton("OK");
			jd.add(jb);
			jb.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent e) {
					irgendeineMethode(tf.getText());
					jd.dispose();
				}

			});
			jd.setVisible(true);
		}
	}

	private void irgendeineMethode(String name) {
		System.out.println(name);
		sandra.setText(name);

	}
}

class Player {
	private String name;

	public void start() {
		name = askForName();
		System.out.println("Your name is " + name);
	}

	protected String askForName() {
		return ("Bernhard");
	}
}

class HumanPlayer extends Player {

	Gui gui;

	public HumanPlayer(Gui gui) {
		this.gui = gui;
	}

	@Override
	protected String askForName() {
		return gui.askForName();
	}
}
```


----------



## hierUndDa (24. Mai 2011)

Was ich gerne möchte ist, dass dieser Aufruf hier funktioniert:

[java=70]
     name = askForName();
[/code]

Dabei soll jedoch nicht das gesamte GUI stehen bleiben (was ja bei JDialog der Fall ist), da ich noch andere Sachen in meinem GUI laufen habe, sondern nur das externe Programm (im Beispiel der HumanPlayer) darauf warten, bis es eine Antwort bekommt.

Grüsse
hierUndDa


----------



## jgh (24. Mai 2011)

die methode funktioniert.


```
Your name is Bernhard
```

sorry, ich weiß nicht was du ansonsten willst...evtl. kann dir jemand anders helfen, ich bin raus^^


----------



## hierUndDa (24. Mai 2011)

Die Methode funktioniert, solange ich einen normalen Player benutze der immer "Bernhard" zurückgibt und eigentlich nichts mit dem GUI zu tun hat. Wenn ich jedoch meinen HumanPlayer, bei dem das GUI einen der beiden Namen auf den Buttons zurückgeben soll, funktionierte es anfangs nicht. 

Mit der Variante von 
	
	
	
	





```
Gestern 23:10
```
 funktioniert das ja jetzt auch. Hab nur gedacht, dass es da vielleicht einen schöneren Weg gibt. Danke trotzdem.


----------

