MouseListener funkioniert auf JPanel nicht

MK234

Aktives Mitglied
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).

Code:
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

Code:
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?
 
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.
 
Code:
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");
		
	}
}


Code:
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);		
	}
 
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.
 
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
Java:
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....
 

Zurück
Oben