# MouseListener funkioniert auf JPanel nicht



## MK234 (29. Jun 2011)

Hallo,

schreibe gerade an einem Zeichenprogramm, in welchem ein JPanel die sog. Zeichentafel darstellen soll.
Ich habe dem Panel einen MouseListener angehängt, jedoch reagiert es nicht auf MouseEvents (Mausklicks).


```
import java.awt.Canvas;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener {

	public Dimension getMinimumSize() {
		return new Dimension(300, 300);
	}
	
	public Dimension getPreferredSize() {
		return getMinimumSize();
	}
	
	public void paint(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(0, 0, 300, 300);
		
	}

	@Override
	public void itemStateChanged(ItemEvent e) {		
		
		if(e.getItem() == "yellow") {					
			System.out.println("yellow wurde gewählt");				
		}
		if(e.getItem() == "red") {
			System.out.println("red wurde gewählt");
		}
		if(e.getItem() == "green") {
			System.out.println("green wurde gewählt");
		}
		if(e.getItem() == "blue") {
			System.out.println("blue wurde gewählt");
		}		
	}

	

	@Override
	public void mouseClicked(MouseEvent arg0) {		
		System.out.println("Maus gedrückt");
	}
	
		
	
}
```

und


```
import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{	

	public static void main(String[] args) {
		JFrame F = new JFrame("PaintCanvas");
		F.setLayout(new BorderLayout());
		F.setSize(300, 300);
		F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			
		
		JPanel panel = new JPanel();
		AuswahlBox auswahlBox = new AuswahlBox();
		panel.add(auswahlBox);
		panel.addMouseListener(auswahlBox);
		F.add(panel, BorderLayout.CENTER);			
		
		Choice choice = new Choice();
		choice.addItemListener(auswahlBox);
		choice.addItem("yellow");
		choice.addItem("red");
		choice.addItem("green");
		choice.addItem("blue");
		JPanel panel1 = new JPanel();
		panel1.add(choice);
		F.add(panel1, BorderLayout.SOUTH);
		F.setVisible(true);		
	}
	
}
```


Woran könnte das liegen?


----------



## Gast2 (29. Jun 2011)

Du solltest Swing und AWT nicht mischen. Evtl. löst das schon das problem.


----------



## MK234 (29. Jun 2011)

gerade habe ich es mit AWT getestet, also statt JFrame Frame und statt JPanel Panel benutzt,
funkioniert leider trotzdem nicht.
Ich habe festgestellt, daß der MouseListener funktioniert, wenn ich das JPanel weglasse und dem JFrame den MouseListener zuordne.
Wenn ich das JPanel in das JFrame einfüge, gibt es eine Stelle, welche vom JPanel nicht überdeckt wird, wenn ich dann an dieser Stelle einen Mausklick mache findet ein Event statt, obwohl ich den MouseListener dem JPanel zugeordnet habe.


----------



## Marco13 (29. Jun 2011)

Poste mal den letzten Stand (bevorzugt NUR mit Swing-Components)


----------



## MK234 (29. Jun 2011)

```
import java.awt.Canvas;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener {

	public Dimension getMinimumSize() {
		return new Dimension(300, 300);
	}
	
	public Dimension getPreferredSize() {
		return getMinimumSize();
	}
	
	public void paint(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(0, 0, 300, 300);
		
	}

	@Override
	public void itemStateChanged(ItemEvent e) {		
		
		if(e.getItem() == "yellow") {					
			System.out.println("yellow wurde gewählt");				
		}
		if(e.getItem() == "red") {
			System.out.println("red wurde gewählt");
		}
		if(e.getItem() == "green") {
			System.out.println("green wurde gewählt");
		}
		if(e.getItem() == "blue") {
			System.out.println("blue wurde gewählt");
		}		
	}

	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus bewegt sich");
		
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus gedrückt");
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus kommt");
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus gepresst");
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus losgelassen");
		
	}
}
```



```
import java.awt.BorderLayout;
import java.awt.Choice;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{	

	public static void main(String[] args) {
		JFrame F = new JFrame("PaintCanvas");
		F.setLayout(new BorderLayout());
		F.setSize(300, 300);
		F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);			
		
		JPanel panel = new JPanel();
		AuswahlBox auswahlBox = new AuswahlBox();
		panel.add(auswahlBox);
		panel.addMouseListener(auswahlBox);
		
		F.add(panel, BorderLayout.CENTER);	
		
		Choice choice = new Choice();
		choice.addItemListener(auswahlBox);
		choice.addItem("yellow");
		choice.addItem("red");
		choice.addItem("green");
		choice.addItem("blue");
		JPanel panel1 = new JPanel();
		panel1.add(choice);
		F.add(panel1, BorderLayout.SOUTH);
		F.setVisible(true);		
	}
```


----------



## Marco13 (29. Jun 2011)

AuswahlBox extends Canvas 

Heavyweight Components (also AWT-Components wie Canvas) krallen sich erstmal alle Events. Damit schlag' ich mich auch gerade rum. Verwende stattdessen JComponent. Dort paintComponent statt paint überschreiben.


----------



## MK234 (29. Jun 2011)

Danke für Erklärung.
Leider habe ich als Vorgabe, daß ich für das Zeichenprogramm Canvas benutzen soll.


----------



## MK234 (29. Jun 2011)

mein Programm funktioniert jetzt. Habe dem Canvas-Programm (AuswahlBox) den MouseListener direkt zugeteilt.


----------



## Marco13 (29. Jun 2011)

Von einem Lehrer? Falls ja, verweise ihn auf diesen Beitrag

*Hallo, Lehrer! Willkommen im Jahr 2011. Lass' deine Schüler mal machen, die kreigen das schon hin.*

Die Ursache ist die gleiche: Der Canvas bekommt die MouseEvents, und das Panel (wo der Canvas drin liegt) nicht. Füg' den MouseListener einfach zum Canvas (also zu sich selbst) hinzu

```
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class Main extends Frame{   

    public static void main(String[] args) {
        Frame F = new Frame("PaintCanvas");
        F.setLayout(new BorderLayout());
        F.setSize(300, 300);
        F.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
            
        });           
        
        Panel panel = new Panel();
        AuswahlBox auswahlBox = new AuswahlBox();
        panel.add(auswahlBox);
        auswahlBox.addMouseListener(auswahlBox);
        
        F.add(panel, BorderLayout.CENTER);  
        
        Choice choice = new Choice();
        choice.addItemListener(auswahlBox);
        choice.addItem("yellow");
        choice.addItem("red");
        choice.addItem("green");
        choice.addItem("blue");
        Panel panel1 = new Panel();
        panel1.add(choice);
        F.add(panel1, BorderLayout.SOUTH);
        F.setVisible(true);     
    }
}

class AuswahlBox extends Canvas implements ItemListener, MouseListener, MouseMotionListener {

	public Dimension getMinimumSize() {
		return new Dimension(300, 300);
	}
	
	public Dimension getPreferredSize() {
		return getMinimumSize();
	}
	
	public void paint(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(0, 0, 300, 300);
		
	}

	@Override
	public void itemStateChanged(ItemEvent e) {		
		
		if(e.getItem() == "yellow") {					
			System.out.println("yellow wurde gewählt");				
		}
		if(e.getItem() == "red") {
			System.out.println("red wurde gewählt");
		}
		if(e.getItem() == "green") {
			System.out.println("green wurde gewählt");
		}
		if(e.getItem() == "blue") {
			System.out.println("blue wurde gewählt");
		}		
	}

	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus bewegt sich");
		
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus gedrückt");
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus kommt");
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus gepresst");
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Maus losgelassen");
		
	}
}
```

EDIT: Jo, das war knapp....


----------

