# Per Klick ein Dialogfenster öffnen



## Xerxes20 (26. Dez 2010)

Hallo,

ich habe ein kleines Problem mit dem Java ActionListener:

Ich bin noch ganz am Anfang des Programms und habe zunächst eine Menüleiste erzeugt mit zwei Elementen und diese haben auch Untermenüs, eine davon heißt Einschreiben.

Wenn man draufklickt soll sich ein Dialogfenster öffnen.

Ich habe alles in Methoden geschreiben, damit es ordentlicher aussieht, nur ist hier das Problem, dass wenn ich einschreiben.addActionListerner(this) verwende, Eclipse meckert! (Cannot use this in static..)


```
public static void Menuleiste(){

//Menüleiste erzeugen
menueLeiste= new JMenuBar();

//Element hinzufügen
JMenu student = new JMenu("Student");
menueLeiste.add(student);

//Untermenü
einschreiben= new JMenuItem("Einschreiben");
student.add(einschreiben);


}
```


----------



## eRaaaa (26. Dez 2010)

Joah richtig, du hast da ja auch eine statische Methode...

http://www.java-forum.org/stichwort-static/3682-static.html
http://www.java-forum.org/stichwort...ic-method-cant-referenced-static-context.html
http://www.java-forum.org/stichwort-static/1353-bedeutet-static.html


----------



## Xerxes20 (26. Dez 2010)

Warum das so ist weiß ich ja, aber wie mache ich es richtig


----------



## eRaaaa (26. Dez 2010)

Gibt sicherlich ein paar Lösungswege, z.B. könntest du anstelle von [c]implements ActionListener[/c] eben für den Listener an einschreiben eine anonyme innere Klasse verwenden. Oder du erstellst eben eine extra externe Klasse die ActionListener implementiert.

Ansonsten wäre jetzt auch die Frage was die Klasse genau macht, in der deine Methode [c]Menuleiste[/c] steht (Methoden vorne übrigens NICHT groß schreiben ;D ). Rein theoretisch ginge sicherlich auch anstelle von 
	
	
	
	





```
einschreiben.addActionListerner(this)
```
 -> 
	
	
	
	





```
einschreiben.addActionListerner(new DieKlasseWoSichDieMethodeBefindet());
```

Führen viele Wege zum Ziel


----------



## Xerxes20 (27. Dez 2010)

Ich danke dir hat super funktioniert! 

Ich hätte noch eine Frage:

Ich möchte ein JDialog per Abbrechen Butten schließen, habe die Funktion auch implementiert, aber irgendwie funktioniert das nicht, was mache ich da falsch?

Hier der Code:


```
public void actionPerformed(ActionEvent object) {


		if (object.getSource() == einschreiben){

			JDialog d=new JDialog(frame, "Einschreiben",true);
			d.setSize(400,400);
			d.setPreferredSize(new java.awt.Dimension(400,400));
			d.setLayout(new FlowLayout(2,80,8));
			d.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

			JButton ab=new JButton("Abbrechen");

			d.add(ab);
			ab.addActionListener(new Hauptmenu());

			d.setVisible(true);

			if (object.getSource()==ab){


				d.dispose();


			}


		}
	}
```


----------



## Xerxes20 (28. Dez 2010)

Hat niemand eine Idee??


----------



## firewarrior (28. Dez 2010)

Mehr Code bitte. Auch wenn ich vermute, dass du im if-Zweig 'if (object.getSource() == einschreiben)' niemals zum if-Zweig 'if (object.getSource()==ab)' kommst.


----------



## Xerxes20 (28. Dez 2010)

Mehr habe ich im moment Leider nicht. Ich will ja erstmal, dass diese Funktion funktioniert


----------



## firewarrior (28. Dez 2010)

Naja, seh es mal so: Wie soll 'object.getSource()' gleichzeitig 'einschreiben' und 'ab' sein? Denn:
	
	
	
	





```
if (object.getSource()==ab) { d.dispose(); }
```
 steht im If-Block von 
	
	
	
	





```
if (object.getSource() == einschreiben) {
```


----------



## Xerxes20 (28. Dez 2010)

Ich weiß zwar nicht worauf du hinaus willst, aber das "einschreiben" bezieht sich auf eine Menüleiste die ich erstellt habe, wenn man auf "einschreiben" klickt öffnet sich ein Dialogfenster (das in der If-Anweisung) und der Button "Abbrechen" wird erstellt, nur führt er die If-Anweisung nicht aus (die zweite).


----------



## firewarrior (28. Dez 2010)

Wie sollte sie denn auch ausgeführt werden? Lies dir nochmal durch, was ich geschrieben habe, und schau dir deine Klammerung an.


----------



## Xerxes20 (28. Dez 2010)

Okay ich habe mal was anderes Probiert, aber das klappt genauso wenig:


```
if (object.getSource() == einschreiben){

			JDialog d=new JDialog(frame, "Einschreiben",true);
			d.setSize(400,400);
			d.setPreferredSize(new java.awt.Dimension(400,400));
			d.setLayout(new FlowLayout(2,80,8));
			d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

            JButton ab=new JButton("Abbrechen");
			d.add(ab);
			ab.setActionCommand("Abbrechen");
			
			ab.setMnemonic(KeyEvent.VK_B);
			ab.addActionListener(this);
			d.setVisible(true);
			
			if ("Abbrechen".equals(object.getActionCommand())){
				
				d.setVisible(false);
				d.dispose();
					
			}
}
```


----------



## Xerxes20 (30. Dez 2010)

Kann mir denn hierbei niemand behilflicht sein?


----------



## eRaaaa (30. Dez 2010)

.... nicht einfach ausprobieren oder drauf los schreiben. Dir fehlen anscheinend noch Grundlagen bei den Listenern. Ich habe oben drei verschiedene Möglichkeiten aufgezählt, hast du dir diese mal durchgelesen und verstanden?

deine zweite if-Abfrage hat dort überhaupt nichts zu suchen - das klappt so alles nicht.


```
final JDialog d = new JDialog(frame, "Einschreiben", true);
		d.setSize(400, 400);
		d.setPreferredSize(new java.awt.Dimension(400, 400));
		d.setLayout(new FlowLayout(2, 80, 8));
		d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

		JButton ab = new JButton("Abbrechen");
		ab.setMnemonic(KeyEvent.VK_B);
		ab.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
					d.dispose();
				}
		});
		d.add(ab);
		d.setVisible(true);
```


Probier`s mal so. Und lies How to Write an Action Listener (The Java™ Tutorials > Creating a GUI With JFC/Swing > Writing Event Listeners)


----------



## Xerxes20 (30. Dez 2010)

Das habe ich auch schon versucht, das klappt auch nicht!


----------



## eRaaaa (30. Dez 2010)

Diese Aussagen helfen hier niemanden weiter....geht nicht - gibt`s nicht !


```
if (object.getSource() == einschreiben){
```
  <-- ist diese Abfrage überhaupt true? Mach mal ein kleines, ausführbares Beispiel welches JEDER nachvollziehen kann, so einzelne Codestücke bringen uns anscheinend nicht weiter.


----------



## henpara (30. Dez 2010)

Wenn, dann muss deine Struktur so, bzw. so ähnlich aussehen:

```
if (object.getSource() == einschreiben){
 
            JDialog d=new JDialog(frame, "Einschreiben",true);
            d.setSize(400,400);
            d.setPreferredSize(new java.awt.Dimension(400,400));
            d.setLayout(new FlowLayout(2,80,8));
            d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 
            JButton ab=new JButton("Abbrechen");
            d.add(ab);
            ab.setActionCommand("Abbrechen");
            
            ab.setMnemonic(KeyEvent.VK_B);
            ab.addActionListener(this);
            d.setVisible(true);
} else if (object.getSource()==ab){
                
                d.setVisible(false); //wobei ich nicht sicher bin, ob er hier das "d" kennt... (evtl. auch umbenennen)
                d.dispose();
                    
}
```
Weil die source is nunmal nur einmal "einschreiben". während sie "einschreiben ist" kann sie aber niemals ab gleichzeitig sein, das heißt dein inneres If is nie true.

Daher mit else if arbeiten (wie oben) um, wenn die Source ab ist, das Fenster zu schließen.

hoffe das passt so.


----------



## firewarrior (30. Dez 2010)

Wahrscheinlich muss man die Variablen noch außerhalb der if-Blöcke deklarieren.


----------



## Xerxes20 (31. Dez 2010)

Hallo,

nein es hat auch ohne else if Anweisung funktioniert. Ich habe die Dateien einem anderen Kollegen geschickt, bei dem es komischerweise wunderbar funktioniert hat. Weiß nicht warum, aber es klappt jetzt.

Vielen Dank an alle


----------

