# MouseListener für mehrere Buttons



## Ghast (10. Nov 2011)

Hi leute, mal ne Frage.
Ich hab ein Programm bei dem ich ein Ereignis auslösen will, wenn ich die Maus über einen Button ziehe.
Das klappt auch wunderbar für einen Button. Aber ich will nicht immer einen neuen MouseListener für jeden Button haben. Ich will einen für alle und dann anhand von if Anweisungen schauen, von welchem Button das Event ausgelöst wurde.

Wisst ihr wie ich das überprüfen kann? Hab es schon mit getSource() etc versucht...ging aber nicht.


```
public class ButtonListener implements MouseListener
	{
	
		public void mouseClicked(MouseEvent arg0) {}

		public void mouseEntered(MouseEvent e) {
			if(e == blabla)
                {
                 macheEtwas();
                }
		}
		public void mouseExited(MouseEvent a) {	}
		public void mousePressed(MouseEvent b) {}
		public void mouseReleased(MouseEvent c) {}
        }
```
Ein button heißt z.B. green, der andere blau.

Danke!


----------



## vatras (10. Nov 2011)

if(e.getSource()==btn2){
   //mache was
}

so müsste das sein


----------



## Ghast (10. Nov 2011)

Hi,
genau das hab ich shcon versucht funktioniert nicht.


----------



## AwsmDude (10. Nov 2011)

Du solltest schon etwas genauer sein mit dem was du versucht hast.
Mit welcher Variable hast du es verglichen? == ist schließlich ein Vergleich auf die Referenz.
Ist der Listener in der gleichen Klasse? (Innere Klasse)
Gerne genaueren Code posten.

Über setActionCommand(String actionCommand), getActionCommand() und Stringvergleichen ließe sich das auch lösen.


----------



## diggaa1984 (10. Nov 2011)

schreib mal ein Minimalbeispiel und stell es hier rein, dann schauen wir mal weiter.


----------



## Toffel2 (10. Nov 2011)

Du kannst den Button mit setName Namen verpassen und dann in der if-Anweisung mit getName() vergleichen.


```
public void mouseEntered(MouseEvent e) {
            if(e.getSource() instanceof JButton)
                {
                    JButton button = (JButton) evt.getSource();
                    if(button.getName().equals("Name1") {
                                     // mach was

                            }
                }
        }
```


----------



## Ghast (10. Nov 2011)

Also das ist meine Klasse. Ich wollte nur was ausprobieren, deshalb ist sie etwas sehr unausgereift.

```
public class utton extends JFrame {
	
	public JFrame frame;
	private JButton blue;
	private JButton red;
	private JButton black;
	public JButton green;
	public Container zusammen;
	
	public utton(String s)  {
		 frame = this;
		 frame.setSize(300,500);
		Container zusammen = frame.getContentPane();
		zusammen.setBackground(Color.CYAN);
		ButtonListener hörer = new ButtonListener();
		zusammen.setLayout(new BorderLayout(20,20));
		Panel buttons = new Panel();
		buttons.setLayout(new FlowLayout (10, 10, FlowLayout.CENTER));
		JButton blue = new JButton("blue");
                blue.addMouseListener(hörer);
		buttons.add(blue);
		JButton green = new JButton("green");
		green.addMouseListener(hörer);
		buttons.add(green, FlowLayout.CENTER);
		zusammen.add(buttons, BorderLayout.SOUTH);
		Panel links =new Panel();
		links.setLayout(new GridLayout(10,1));
		links.setBackground(Color.blue);
		this.setVisible(true);
		JButton red = new JButton("red");
		links.add(red);
		zusammen.add(links,BorderLayout.WEST);
		JButton black = new JButton("black");
		black.addMouseListener(hörer);
		links.add(black);
		frame.pack();
		
	}

	
	
	
	
	
	
	
	
	public class ButtonListener implements MouseListener
	{
		@Override
		public void mouseClicked(MouseEvent arg0) {}
		public void mouseEntered(MouseEvent e) {
			if(e.getSource()==green){
				
			zusammen.setBackground(Color.green);
			
			}
			if (e.getSource() ==blue)
			{
				zusammen.setBackground(Color.blue);
			}
                        //etc
		}
		public void mouseExited(MouseEvent e) {	}
		public void mousePressed(MouseEvent e) {}
		public void mouseReleased(MouseEvent e) {}}	
	}
```
Wie ihr seht habe ich mehrere Buttons, die, wenn man mit der Maus darüber geht die Farbe des Containers änder. Mit einem Button kriege ich das ganze wunderbar hin. Nur habe ich keine Lust für jeden Button nen eigenen Listener zu schreiben!


----------



## vanny (10. Nov 2011)

Leg dir doch sonst im Frame ´ne Map oder ein Set an, als Key benutzt du den String, den du per getName(); von deinen Komponenten bekommst und als Value halt die Color, die gesetzt werden soll.

Dann noch ne Methode zBsp. 
	
	
	
	





```
farbeSetzen(String name){
}
```

dann in deinem Listener noch die Referenz des Frames mitschicken und einfach in deiner Eventmethode

```
frame.farbeSetzen(e.getSource().getName());
```

und ab gehts 

ich hoffe du verstehst mich

Gruß Vanny


----------



## bygones (10. Nov 2011)

du hast instanzvariablen blue, green etc, aber auch lokale variablen

[c]JButton green = new JButton("green");[/c] ueberschreibt deine instanzvariable, daher funktioniert die abfrage mit getSource() nicht


----------



## Ghast (10. Nov 2011)

ahhhhhhh wie geil es geht. 
Lag wirklich an den variablen!
Danke Leute.


----------



## Ghast (10. Nov 2011)

Sorry 4 Doppelpost.
Da fällt mir noch was ein und zwar:
Wenn ich ein JMenuItem in ein Menu hinzufüge und will, dass beim Klick auf dieses Iaem, sagen wir mal es heißt FAQ, etwas ausgegeben haben will, kann ich das Item dann so behandeln wie einen Button?
Also, dass erst nach dem draufdrücken, bzw Mausklick das Fenster geöffnet wird? Kriege das nicht hin
[Java]
        Ausfuhrer ausfuhren = new Ausfuhrer(); 
        menubar = new JMenuBar();
	menu = new JMenu("Über");
	uber = new JMenuItem("FAQ");
      uber.addActionListener(ausfuhren); 

[/code]

```
public class Ausfuhrer implements ActionListener
{

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() ==  uber)
		{
			
			System.out.println("ich hasse JAva");
		}
}
```

Wieso geht das nich?


----------



## diggaa1984 (11. Nov 2011)

glaskugel zück:
Weil uber in dem actionListener nicht bekannt ist?! Andere Klasse?


----------

