# Dialog erstellen und Eingaben lesen?



## mobile (29. Apr 2006)

Gute Nacht,

habe mal eine Frage ich möchte mir ein Dialog erstellen. Aufgerufen wird er aus einem Fenster über die JMenuBar. Habe noch nie mit Dialogen gearbeitet. Hab mir mal was aus meinem Büchlein zusammengesucht. Aber irgendwie ist das noch nicht so das Wahre!


```
public class Dialoge extends JDialog implements ActionListener {
	
	JTextField eingabe;
	
	//Ereignisbehandlung für den Dialog = WindowLauscher
	class FensterBeenden extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			setVisible(true);
		}
	}
	
	//Konstruktor
	Dialoge(JFrame f,String titel) {
		super(f,titel,true);
		setResizable(false);
		
		//Panel mit Abfrage anlegen
		JPanel anzahl = new JPanel();
		JLabel frage = new JLabel("Wie viele Aufgaben möchtest du rechnen?");
		eingabe = new JTextField(3);
		
		anzahl.add(frage);
		anzahl.add(eingabe);
		
		eingabe.getText();
		
		pack();
		
		//Ereignisbehandlung für den Dialog = WindowLauscher
		class FensterBeenden extends WindowAdapter {
			public void windowClosing(WindowEvent e) {
				setVisible(true);
			}
		}
		
		addWindowListener(new FensterBeenden());
		
		public void actionPerformed(ActionEvent e) {
			
		}
	
	}
}
```

Ziel soll es sein abzufragen, wie viele Aufgaben man rechnen möchte. Also wie oft eine Methode wiederholt werden soll. Dazu muss diese Methode (mit for-Schleife) die Variable aber erhalten. 

"eingabe" ist das JTextField. Hier soll die int Variable eingegeben werden und dann ausgelesen werden, geht doch mit getText(); oder?

Wenn das alles geht, dank eurer Hilfe, dann habe ich die nächste Frage. 
Wie kann ich denn jetzt die eingegebene Variable in meinem Fenster anzeigen und verwenden? 

Danke für HIlfe!


----------



## André Uhres (29. Apr 2006)

```
//package schnipsel2;
/*
 * Dialoge.java
 */
import java.awt.event.*;
import javax.swing.*;
public class Dialoge extends JDialog implements ActionListener {
    JTextField eingabe;
    //Ereignisbehandlung für den Dialog = WindowLauscher
    class FensterBeenden extends WindowAdapter {
        public void windowClosing(WindowEvent e) {
            setVisible(true);
        }
    }
    //Konstruktor
    Dialoge(JFrame f,String titel) {
        super(f,titel,true);
        setResizable(false);
        //Panel mit Abfrage anlegen
        JPanel anzahl = new JPanel();
        JLabel frage = new JLabel("Wie viele Aufgaben möchtest du rechnen?");
        eingabe = new JTextField(3);
        anzahl.add(frage);
        anzahl.add(eingabe);
        add(anzahl);
        eingabe.addActionListener(this);
        pack();
        //Ereignisbehandlung für den Dialog = WindowLauscher
        class FensterBeenden extends WindowAdapter {
            public void windowClosing(WindowEvent e) {
                dispose();
            }
        }
        addWindowListener(new FensterBeenden());
    }
    public void actionPerformed(ActionEvent e) {
        String str = eingabe.getText();
        ((TestDialoge)getParent()).setAnzahl(str);
        dispose();
    }
    public static void main(String[] args){
        new TestDialoge();
    }
}
class TestDialoge extends JFrame{
    public TestDialoge(){
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        JMenuBar bar = new JMenuBar();
        JMenuItem item = new JMenuItem("Dialog");
        item.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                doAction();
            }
        });
        JMenu menu = new JMenu("Menu");
        menu.add(item);
        bar.add(menu);
        setJMenuBar(bar);
        label = new JLabel();
        bar.add(label);
        setVisible(true);
    }
    private void doAction(){
        Dialoge dia = new Dialoge(this, "Dialog");
        dia.setSize(300,80);
        dia.setLocationRelativeTo(this);
        dia.setVisible(true);
        label.setText("  Anzahl: "+anzahl);
    }
    public void setAnzahl(String str){
        anzahl = str;
    }
    private String anzahl;
    private JLabel label;
}
```


----------



## mobile (29. Apr 2006)

Dankeschön, nur wie kann ich denn Dialog jetzt auufrufen?


```
//Behandlung für MenüLeiste 
	class Menu implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(add.isSelected() == true) {
				add();
			}
			else if(sub.isSelected() == true) {
				sub();
			}
			else if(mul.isSelected() == true) {
				mul();
			}
			else if(div.isSelected() == true) {
				div();
			}
		}
	}
```

Das ist die Methode für den Eintrag meiner MenuLeiste im HauptFenster class Rechnen. Mit welcher Methode kann ich jetzt den Dialog aufrufen?
Der Dialog ist in der Klasse Dialoge (s.o). Also muss ich doch eigentlich:


```
//Behandlung für MenüLeiste 
	class Menu implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(add.isSelected() == true) {
//Hier soll Dialog geöffnet werden
Dialoge open = new Dialoge();
open.//mehtode zum öffnen des Dialogs
				add();
			}
			else if(sub.isSelected() == true) {
				sub();
			}
			else if(mul.isSelected() == true) {
				mul();
			}
			else if(div.isSelected() == true) {
				div();
			}
		}
	}
```

Danke!


----------



## mobile (29. Apr 2006)

Also ich habe es jetzt hin bekommen er öffnet sich. Aber jetzt bekomme ich ja ein zweites Fenster. Wo sich dann der Dialog öffnet und das eigegebene steht dann in dem neuen Fenster in der MenuBar.

Wollte eigentlich, dass der sich im gleichen Fenster öffnet, wo ich auch drin arbeite(rechne), also im Fester Rechnen. Dies befindet sich in der class Rechnen.


```
public final class Rechnen extends JFrame {
	private static final long serialVersionUID = 1L;
	
	...//Methode für Rechenarten
	
        //Ereignisbehandlung für das Fenster = WindowLauscher
	class FensterBeenden extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}
	}
	
	//Behandlung für MenüLeiste 
	class Menu implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if(add.isSelected() == true) {
               //Hier soll der Dialog aufgerufen werden
				TestDialoge open = new TestDialoge();
				open.doAction();
				add();
			}
			else if(sub.isSelected() == true) {
				sub();
			}
			else if(mul.isSelected() == true) {
				mul();
			}
			else if(div.isSelected() == true) {
				div();
			}
		}
	}
	
	...//Hier wird Fenster über Menü geschlossen	
	
	//Ereignisbehandlung für das Eingabefeld ergebins. Hier wird das Ergebnis aus dem JTextField gelesen
	
... 

//Kontruktor der Main class hier wird alles erstellt
	....//Panels mit Elementen...usw
		
//Fenster und ELemente bei Listener anmelden
		...
		
//Elemente bei Listener anmelden
		....
	}

	JLabel aufste;
	JTextField ergebnis;
	JTextField ergtest;
	JRadioButton add;
	JRadioButton sub;
	JRadioButton mul;
	JRadioButton div;
	JMenuItem ende;
	JMenuItem start;
	JLabel aufakt;
	JLabel aufzahl;
	
	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		Rechnen start = new Rechnen("Jetzt lerne ich Mathe");
		start.pack();
		start.show();
	}
	
}
```

Wo muss ich jetzt den Dialog schreiben, dass er aus diesem Fenster geöffnet wird?

DAnke!


----------



## André Uhres (29. Apr 2006)

timkon hat gesagt.:
			
		

> LAos ich habe es jetzt hin bekommen er öffnet sich.
> Aber jetzt bekomme ich ja ein zweites Fenster. Wo sich dann der Dialog öffnet.


Das ist ja auch der Sinn eines Dialogs.



			
				timkon hat gesagt.:
			
		

> Wollte eigentlich, dass der sich im gleichen Fenster öffnet, wo ich auch drin arbeite(rechne).?


Dann ist es kein Dialog mehr.


----------



## mobile (29. Apr 2006)

Wie das ist der Sinn? Der Sinn von einem Dialog ist es ein neues Fenster zu öffnen und in diesem neuen Fester word wiederum das Fenster mit dem Dialog angezeigt?

Ich denke ein Dialog ist im Grunde ein Fenster, das heißt doch ich kann ihn auch wie ein normales Fenster öffnen, ohne das ich gleich noch ein Fenster zusätzlich zum Dialog bekomme.

Wenn das nich geht nehmen ich wohl einfach ein normales Fenster. 

Merci!


----------



## Leroy42 (29. Apr 2006)

Die Swing-Dialoge brauchen nicht unbedingt ein eigenes Fenster (JFrame), du kannst sie auch 
auf einem normalen JPanel betten.

Ich habe mir z.B mal einen Dialog zur Datumseingabe/anzeige geschrieben, den der User
wahlweise als eigenständiges Fenster aufrufen kann und/oder in einer JTabbedPane einfach per
Klick auf einen Reiter anstelle der eigentlichen Anwendung einblendet; dann bleibt der Desktop
hübsch übersichtlich.


----------



## André Uhres (29. Apr 2006)

timkon hat gesagt.:
			
		

> Wie das ist der Sinn?
> Der Sinn von einem Dialog ist es ein neues Fenster zu öffnen
> und in diesem neuen Fester word wiederum das Fenster mit dem Dialog angezeigt?


Nein, der Dialog *ist* ein Fenster das aber vom Frame (also dem Hauptfenster) abhängig ist.



			
				timkon hat gesagt.:
			
		

> Ich denke ein Dialog ist im Grunde ein Fenster,
> das heißt doch ich kann ihn auch wie ein normales Fenster öffnen,
> ohne das ich gleich noch ein Fenster zusätzlich zum Dialog bekomme.


Ein Dialog ist immer ein *zusätzliches* Fenster.
Beispiel: viele Anwendungen haben ein Menü "Datei" ("File") mit einem Menüpunkt "Drucken..." ("Print...").
Wenn du "Drucken..." wählst, dann erscheint ein *zusätzliches* (gewöhnlich kleineres) Fenster:
das ist der Druck*dialog* !


----------



## mobile (29. Apr 2006)

Ja genau so wie in dem Beispiel wollte ich das ja machen. 

Aber wenn ich jetzt bei mir in der MenuLeiste was anklicke, dann hat sich ein neues Fenster geöffnet. Also ein ganz normales und zusätzlich noch das Fenster wo dann der eigentliche Dialog drin steht. Also quasi 2 Fenster. Ein normales und einmal der Dialog.

Also mein Hauptfenster wäre ja in der class Rechnen, der Dialog müsste dann davon abhängig sein oder?

Will jetzt ja nur den Dialog, so wie es in deinem Beispiel auch beschrieben ist.


----------



## Leroy42 (29. Apr 2006)

timkon hat gesagt.:
			
		

> Aber wenn ich jetzt bei mir in der _MenuLeiste_ was anklicke, dann hat sich _ein neues_ Fenster geöffnet. Also _ein ganz normales_ und _zusätzlich_ noch das Fenster wo dann der eigentliche Dialog drin steht.


 :shock:  :shock:  :shock: 
Zum Mitschreiben:

- Du hast ein (Applikations-)Fenster _mit_ einem Menu
- Du wählst ein Menüeintrag aus
- Das Dialogfenster (Fenst mit dem Dialog geht auf)
- Und dann geht _noch ein_ Fenster auf?  Also hast du insgesamt drei Fenster? :autsch: 

Oder wie jetzt...


----------



## mobile (29. Apr 2006)

Richtig genau so ist es. Ist doch irgendwas falsch oder? Es soll sich ja nur das Dialog Fenster öffnen


----------



## André Uhres (29. Apr 2006)

timkon hat gesagt.:
			
		

> Ja genau so wie in dem Beispiel wollte ich das ja machen.
> 
> Aber wenn ich jetzt bei mir in der MenuLeiste was anklicke, dann hat sich ein neues Fenster geöffnet. Also ein ganz normales und zusätzlich noch das Fenster wo dann der eigentliche Dialog drin steht. Also quasi 2 Fenster. Ein normales und einmal der Dialog.
> 
> ...


Sry, das übersteigt jetzt meine Hutschnur. 
Ich kann dir da leider nicht weiterhelfen.

[EDIT] Ich hab dir ein funktionierendes Beipiel gegeben. Schau dir das noch mal an.
vielleicht verstehst du es ja irgendwann einmal. Es gibt auch noch viele Lehrbücher
die dir das lang und breit erklären.


----------



## Leroy42 (29. Apr 2006)

Ich bin zwar auch kurz vorm Aufgeben, vor allem weil ich
nebenbei noch in einem Nachbar-Thread verzweifelt versuche,
eine Methode zu entwickeln die einfach Punkte ausgibt  :shock: 
und ich neben-nebenbei  JSP/SQL-Code für eine neue Version
eines Online-Bestellsystems erfrickele; sozusagen Operation am offenen Herzen  :shock: 

Aber solange ich noch genügend Tabak habe, ...  

Poste doch mal deinen actionListener-Code für den Menüeintrag,
also die Zeilen die bei Klicken auf dein Menüeintrag ausgeführt werden.


----------



## mobile (29. Apr 2006)

Ja das Beispiel hat auch super funktioniert, aber irgendwie ist das etwas komisch, dass ich zwei FEnster bekomme. also insgesammt habe ich 3. Vielleicht habe ich ja auch irgendwas falsch gemacht!


----------



## Leroy42 (29. Apr 2006)

timkon hat gesagt.:
			
		

> Vielleicht habe ich ja auch irgendwas falsch gemacht!



 :applaus:  :applaus:  :applaus: 

Also ich schmolle/schlafe jetzt bis



			
				Leroy42 hat gesagt.:
			
		

> Poste doch mal deinen actionListener-Code für den Menüeintrag,
> also die Zeilen die bei Klicken auf dein Menüeintrag ausgeführt werden.



 :gaen:


----------



## mobile (29. Apr 2006)

```
//Behandlung für MenüLeiste 
	class Menu implements ActionListener {
		@SuppressWarnings("deprecation")
		public void actionPerformed(ActionEvent e) {
			if(add.isSelected() == true) {
//Hier soll dann der Dialog aufgerufen werden                               
                               add();
				
			}
			else if(sub.isSelected() == true) {
//und hier auch
				sub();
			}
			else if(mul.isSelected() == true) {
//und hier auch
				mul();
			}
			else if(div.isSelected() == true) {
//und hier auch
				div();
			}
		}
	}
```


----------



## Leroy42 (29. Apr 2006)

Sieht korrekt aus. Dann poste mal eine der Methoden add(), sub(), mul() oder div()

Irgendwo muß der Hund ja begraben sein, der dir _noch ein_ Fenster aufmacht.


----------



## mobile (29. Apr 2006)

```
public void add() {
		Random zahlen = new Random();
		int zahl1 = zahlen.nextInt(10);
		int zahl2 = zahlen.nextInt(10);
		int zahl3 = zahl1+zahl2;
		ergtest.setText(""+zahl3);
		aufste.setText(zahl1 + " + " + zahl2 + " = ");
	}
```

Hier dürfte aber eigentlich nichts falsch sein


----------



## Leroy42 (29. Apr 2006)

Da ist auch nichts falsch.

Aber wo bitte sehr, wird denn dein Dialog geöffnet. In den Methoden, die du gepostet hast jedenfalls nicht.


----------



## mobile (29. Apr 2006)

Geöffnet werden soll er in dem ActionListener für die Menubar. (Hab ich grad gepostet) da steht der aufruf nur nicht drin.

Vielleicht habe ich auch falsch aufgerufen.

Wie würde der Aufruf denn aussehen, wenn man sich auf das Beispiel von Hr. André Uhres bezieht.


----------



## Leroy42 (29. Apr 2006)

timkon hat gesagt.:
			
		

> da steht der aufruf nur nicht drin.
> 
> Vielleicht habe ich auch falsch aufgerufen.


 :shock: 

Wie kannst du ihn falsch aufgerufen haben, wenn er da gar nicht _drinsteht_?
Und wie sollen wir ihn analysieren wenn du ihn nicht mitpostest?

Sorry, aber jetzt kann ich auch nicht mehr. Außerdem ist die online-Operation
an meiner Datenbank gelungen und ich düse dann mal ins Wochenende.

Dennoch: Viel Erfolg und ein schönes WE


----------

