# JMenuItem ActionListener



## Coder21 (3. Sep 2007)

Hallo,

ich habe mehrere JMenuItems, alle mit dem gleichen ActionListener.
Nun will ich herausfinden von welchem JMenuItem das Event ausgeht.

Folgendes habe ich schon ausprobiert, hat aber nicht funktioniert:

```
JMenuItem gelb=new JMenuItem("Gelb");
JMenuItem rot=new JMenuItem("Rot");
gelb.addActionListener(this);
rot.addActionListener(this);
...

public void actionPerformed(ActionEvent event)
{
     if(event.getSource()==rot)
     ...
}
```

Ich habe mir schon das Tutorial hier durchgelesen, bei dem diese Methode beschrieben wird, aber irgendwie klappt's bei mir einfach nicht!

Da ich mehrere JMenuItems mit gleichem Text habe, kann ich event.getActionCommand() nicht verwenden.

Danke schonmal für eure Antworten! :wink:


----------



## The_S (3. Sep 2007)

was heißt "klappt nicht"? Fehlermeldung? Fehlverhalten? Normal sollte das so gehen. Code schaut korrekt aus.


----------



## Coder21 (3. Sep 2007)

Es kommt keine Fehlermeldung.
Der Code nach dem if wird einfach nicht ausgeführt!


----------



## mikachu (3. Sep 2007)

ich will mich jez nicht auf all zu dünnes eis begeben, aber probier mal statt dem doppel-ist-gleich ein equals()


----------



## Gast2 (3. Sep 2007)

dürfte eigentlich kein unterschied machen aber veruschs mal mit equals


----------



## Coder21 (3. Sep 2007)

Auch equals() funktioniert nicht und der ActionListner ist implementiert, sonst würde ja

```
rot.addActionListner(this);
```
eine Fehlermeldung erzeugen.


----------



## The_S (3. Sep 2007)

Es macht auch keinen Unterschied. Lass dir in der actionPerformed doch einfach mal das aktuelle Objekt anzeigen. Dann siehst du ja, welches selektiert wurde.


----------



## Coder21 (3. Sep 2007)

Was meinst du mit "anzeigen"?


----------



## The_S (3. Sep 2007)

Naja, z. B. den Text des Elements ausgeben lassen. Damit kannst du überprüfen, ob auch das richtige übergeben wird.


----------



## Gast2 (3. Sep 2007)

debuge doch einfach mal durch und schau mit inspect deine bedinung an!!!
oder hast du nach dem if() ';' gesetzt


----------



## Coder21 (3. Sep 2007)

Also bei folgendem:

```
public void actionPerformed(ActionEvent e)
{
     System.out.println(e);
}
```

erhalte ich die Ausgabe:
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=Rot,when=1188817911078,modifiers=Button1] on javax.swing.JMenuItem[,1,87,111x21,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.metal.MetalBorders$MenuItemBorder@a39137,
flags=264,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,
margin=javax.swing.plaf.InsetsUIResource[top=2,left=2,bottom=2,right=2],paintBorder=true,paintFocus=false,
pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Rot]


----------



## The_S (3. Sep 2007)

naja, wenn du auf rot klickst, kann er ja auch nicht in gelb reingehen ...


----------



## Coder21 (3. Sep 2007)

Entschuldigung, da habe ich jetzt nur die JMenuItems vertauscht. Habs auch schon ausgebessert.


----------



## The_S (3. Sep 2007)

und das heißt? Poste mal die komplette actionPerformed ...


----------



## Coder21 (3. Sep 2007)

```
public void actionPerformed(ActionEvent event)
{
     	if(event.getSource()==rot)
		System.out.println("Rot");
}
```

Ich bin jetzt nur etwas durcheinander gekommen mit rot und gelb.


----------



## The_S (3. Sep 2007)

ja und? Ich wollte wissen ob es jetzt geht ...

Wie kann man mit rot und gelb durcheinander kommen? :lol: es sei denn du hast sowas fabriziert


```
rot = new JMenuItem("Gelb");
gelb = new JMenuItem("Rot");
rot.setForeground(Color.red);
rot.setBackground(Color.yellow);
gelb.setForeground(Color.yellow);
gelb.setBackground(Color.red);
```


----------



## Coder21 (3. Sep 2007)

Nein, es funktioniert nicht.


----------



## The_S (3. Sep 2007)

Dann poste mal ein KSKB


----------



## Gast2 (3. Sep 2007)

oder versuch es mal so in der art....

```
public class test extends JFrame implements ActionListener
{
	private JMenu menu;
	private JMenuBar bar;
	private JMenuItem rot;
	private JMenuItem gelb;
	public test()
	{
		bar=new JMenuBar();
		
		menu=new JMenu("Rot/Gelb");
		rot=new JMenuItem("Rot");
		rot.addActionListener(this);
		gelb=new JMenuItem("Gelb");
		gelb.addActionListener(this);
		menu.add(rot);
		menu.add(gelb);
		bar.add(menu);
	setJMenuBar(bar);
	setSize(400,400);
	setVisible(true);
	}
	


	public void actionPerformed(ActionEvent event) {
		if(event.getSource()==rot)
		{
			System.out.println("ROT");
		}
		
	}
	
	public static void main(String [] args)
	{
		new test();
	}

	
}
```


----------



## Coder21 (3. Sep 2007)

Hier ein KSKB:


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

public class Beispiel extends JFrame implements ActionListener
{
	JTextField tf=new JTextField("Farbe auswählen");
	JMenuBar mbr=new JMenuBar();
	public Beispiel()
	{
		setSize(400,200);
		setLayout(new GridLayout(4,1));
		mbr.add(Farbe());
		setJMenuBar(mbr);
		add(tf);
		setVisible(true);
	}
	JMenuItem rot;
	JMenuItem gelb;
	public JMenu Farbe()
	{
		JMenu Farbe = new JMenu("Farbauswahl");
		JMenuItem rot=new JMenuItem("Rot");
		JMenuItem gelb=new JMenuItem("Gelb");
		rot.addActionListener(this);
		gelb.addActionListener(this);
		Farbe.add(rot);
		Farbe.add(gelb);
		return Farbe;
	}
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource()==gelb)
			tf.setText("GELB ausgewählt");
		else if(e.getSource()==rot)
			tf.setText("ROT ausgewählt");
	}
	public static void main(String[] args)
	{
		new Beispiel();
	}
}
```


----------



## The_S (3. Sep 2007)

Also dein erstes Beispiel funktioniert bei mir ohne Probleme. Deshalb hab ich dein zweites auch erst gar nicht ausprobiert.

[edit] Achso, das 1. is ja gar net von dir ^^. Mom


----------



## Gast2 (3. Sep 2007)

das 1. ist von mir 

1. attribute schreibt man klein genausowie der methoden anfang
2. attribute schreibt man am anfang einer klasse und warum schreibst du 
JMenuItem rot=.....

lass das JMenuItem weg....


----------



## Coder21 (3. Sep 2007)

Das erste Beispiel ist nicht von mir. Das funktioniert auch bei mir, aber mein Beispiel funktioniert nicht!


----------



## Gast2 (3. Sep 2007)

```
package test;
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

public class Beispiel extends JFrame implements ActionListener 
{ 
   JTextField tf;
   JMenuBar mbr=new JMenuBar(); 
   JMenuItem rot; 
   JMenuItem gelb; 
   public Beispiel() 
   { 
      
      setLayout(new GridLayout(4,1));
      
      tf=new JTextField("Farbe auswählen");
      mbr.add(getMenu() ); 
      setJMenuBar(mbr); 
      getContentPane().add(tf); 
      setSize(400,200); 
      setVisible(true); 
   } 

   public JMenu getMenu() 
   { 

    //Schau dir das hier nochmal an und vergleich es mit deinem 
      JMenu farbe = new JMenu("Farbauswahl"); 
      rot=new JMenuItem("Rot"); 
      gelb=new JMenuItem("Gelb"); 
      rot.addActionListener(this); 
      gelb.addActionListener(this); 
      farbe.add(rot); 
      farbe.add(gelb); 
      return farbe; 
   } 
   public void actionPerformed(ActionEvent e) 
   { 
      if(e.getSource()==gelb) 
         tf.setText("GELB ausgewählt"); 
     
      if(e.getSource()==rot) 
         tf.setText("ROT ausgewählt"); 
   } 
   public static void main(String[] args) 
   { 
      new Beispiel(); 
   } 
}
```


----------



## The_S (3. Sep 2007)

Dein Beispiel kann auch gar nicht funktionieren, da rot und gelb keine Klassenvariablen sind. Bzw. weil du die Klassenvariablen nicht verwendest, sondern neue Objekte erzeugst.


----------



## Gast2 (3. Sep 2007)

doch sie sind klassenvariabeln schau mal vor die Methode Farbe   er hat sie mitten rein geschrieben


----------



## Coder21 (3. Sep 2007)

Wie konnte ich das nur übersehen!   

Danke für eure Antworten!
Funktioniert alles.


----------

