# Erstes arbeiten mit GUI



## Guest (24. Jun 2007)

Hallo Leute, kann mir viell jemand sagen oder zeigen weshalb mein Programm nicht läuft?
Ich soll ein kleines Frame mit Hilfe von ActionListener gestalten mit den Menüpunkten Datei & Info.
Dabei hat Datei die Unterpunkte Neu & Beenden.
Jedoch schimpft mein Eclipse Programm und unterstreicht schon in der ersten Zeile den Klassennamen & weiter später in der letzten Methode in der Klammer den Typ 'ActioEvent'.
Hmmmm, kann jemand den Fehler erkennen?!


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import javax.swing.*;

public class UsingGUIElements extends JFrame implements ActionListener {

	/**
	 * @param args
	 */

	private JMenu menueFile1, menueFile2;
	private JMenuItem menueItemNew, menueItemClose;
	
	public static void main(String[] args) {
		new UsingGUIElements();
	}
	
	public UsingGUIElements(){
		super("GUI Elements");
		
		JMenuBar menueBar = new JMenuBar();
		
		menueFile1 = new JMenu("Datei");
		menueItemNew = new JMenu("Neu");
		menueItemClose = new JMenu("Beenden");
		
		menueFile1.add(menueItemNew);
		menueFile2.add(menueItemClose);
		
		
		menueFile2 = new JMenu("Info");
		
		menueBar.add(menueFile1);
		menueBar.add(menueFile2);
		
		this.setJMenuBar(menueBar);
		
		menueItemNew.addActionListener(this);
		menueItemClose.addActionListener(this);
		
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBackground(Color.LIGHT_GRAY);
		this.setSize(300,300);
		this.setResizable(true);
		this.setVisible(true);
		/**Konstruktor mit dem Attributen des Fensters*/
	}
	
	public void actionPerformed(ActionEvent actionEvent){
		if(actionEvent.getSource() == menueFile1){
			System.out.println("Sie haben den Menuepunkt Datei ausgewaehlt.");
		}
		else if(actionEvent.getSource() == menueFile2){
		System.out.println("Sie haben den Menuepunkt Info ausgewaehlt.");
		}
	}
}
```


----------



## Beni (24. Jun 2007)

Dir fehlt doch ein Import für ActionEvent. Mach mal "ctrl + shift + o" um "java.awt.event.ActionEvent" zu importieren.


----------



## JPKI (24. Jun 2007)

Oder schreib einfach

```
import java.awt.event.*;
```


----------



## Bjoern2 (24. Jun 2007)

Wie oben gesagt.
Und dass Eclipse dir den Klassennamen bei JFrame's und JPanel's gelb unterstreicht ist normal.
Hier will Eclipse noch folgendes:

```
private static final long serialVersionUID = [i]EinWert[/i];
```
Ist aber nicht unbedingt notwendig.


----------



## JPKI (24. Jun 2007)

Ja, ich weiss. Eclipse ist eigentlich super, doch mich nervt auch die fast schon erzwungene serivalVersionUID wenn irgendwas Serializable implementiert...


----------



## Wildcard (24. Jun 2007)

JPKI hat gesagt.:
			
		

> Ja, ich weiss. Eclipse ist eigentlich super, doch mich nervt auch die fast schon erzwungene serivalVersionUID wenn irgendwas Serializable implementiert...


Ist ja nicht so das man die Warnung nicht ausschalten könnte  :wink:


----------



## merlin2 (24. Jun 2007)

Und was ist, wenn man
	
	
	
	





```
@SuppressWarnings("serial")
```
 schreibt (Zweiter Vorschlag von eclipse)? Welche Warnungen werden dadurch noch unterdrückt?


----------



## Gast (24. Jun 2007)

Ok,
das rot unterstrichene ist weg.
Jedoch gibt er mir eine Exception an:
"Exception in thread "main" java.lang.NullPointerException
	at UsingGUIElements.<init>(UsingGUIElements.java:29)
	at UsingGUIElements.main(UsingGUIElements.java:16)
"
Was passt denn da nicht?!
Kann ich mit der Zeile 29 nicht im Hauptmenü einen zweiten Punkt erstellen?


----------



## Ellie (24. Jun 2007)

Du musst Zeile 29 mit der nachfolgenden vertauschen. Bei dir wird ein Menüeintrag an ein noch nicht erzeugtes Menü angehängt.


----------



## Gast (25. Jun 2007)

Hmm, wenn ich die Zeile 29 mit der anderen vertausche tritt die gleiche Exception auf nur mit der veränderten Zeile...
Also grob stimmt mein Programm, ja?


----------



## babuschka (26. Jun 2007)

Du möchtest doch die Menüpunkte Neu und Beenden im Menü Datei haben. Du fügst aber Beenden Menü Info zu, was du noch gar nicht erzeugt hast zu diesem Zeitpunkt.

Wenn ich richtig liege, musst du statt:

```
menueFile2.add(menueItemClose);
```

einfach


```
menueFile1.add(menueItemClose);
```

schreiben. Wenn du die Variablen sprechender wählst wie menueFileDatei statt 1 kommt es nicht so leicht zu Verwechslungen.


----------



## Gast (26. Jun 2007)

Danke!
Jetzt klappt es & das wegen einer minimalen Änderung...


----------



## Gast (26. Jun 2007)

Kann mir denn jemand sagen, weshalb die Ausgabe nicht klappt, wenn ich einen Menüpunkt anklicke???
Denn leider gibt mir die Konsole nichts aus...


----------



## Ellie (27. Jun 2007)

Weil deine actionPerformed()-Methode Ereignisse von Menüs behandelt, die ActionListener aber Menüeinträgen zugewiesen sind. 

Übrigens:
1. Von ihren Namen ausgehend scheint es ein Fehler zu sein, dass du menueItemNew und menueItemClose als JMenus erzeugst, da sollte wohl stehen:


```
menueItemNew = new JMenuItem("Neu");
menueItemClose = new JMenuItem("Beenden");
```

2. Bitte editiere den oben geposteten Code nach jedem Fehlerfund, so werden wir nicht durch Fehler abgelenkt, die schon angesprochen wurden.

3. ActionPerformed() sollte Ereignisse von Menüeinträgen, nicht von Menüs abfangen. Ich habe gerade die ActionListener anders gesetzt und es so ausprobiert, wie es bei dir in der Methode steht – die GUI reagierte gar nicht auf Anklicken von Menüs. Man muss also Anklicken von JMenuItems behandeln.


----------



## Gast (27. Jun 2007)

Dankeschön!
Jetzt ist es auch so, wie ich es haben sollte.
Zuvor waren bei den Untermenüs noch solche Pfeile (als ob man in weitere Untermenüpunkte gehen wollen würde).
Auch die Ausgabe klappt nach der Änderung.
Danke nochmal.


----------



## Gast (28. Jun 2007)

Viell noch eine kleine Frage:
Was müsste ich denn schreiben, dass er mir ausgibt, dass ich den Menüpunkt Info angeklickt habe?!
Also, das funktioniert nicht:
		else if(actionEvent.getSource() == menueFile2){
			System.out.println("Sie haben den Menuepunkt Info ausgewaehlt.");
			}

Wie denn?


----------



## Ellie (4. Jul 2007)

Was passiert denn? Wahrscheinlich ist's aber ein Flüchtigkeitsfehler, z.B. dass der ActionListener nicht zugewiesen wurde oder die Quelle gar nicht "menueFile2" heißt.


----------

