# MouseListener einfügen



## schiese (20. Juli 2014)

Hallo,

ich habe vor einigen Tagen mit Java angefangen und habe nun mein erstes Problem. Ich erstelle ein JFrame, auf dem ich Quadrate zeichne. Bei einem Klick auf eine Stelle des Panels sollen die Quadrate neu gezeichnet werden, aber erst ab der Stelle des Klicks.
Um dies zu erreichen habe ich einen MouseListener implementiert. Den füge ich dem JPanel wie folgt zu: panel.addMouseListener(this) . Als nächstes möchte ich mir mit der Methode mouseClicked() die Koordinaten (getX() und getY()) des Klicks holen. Und repaint(9 mit den geänderten Startwerten aufrufen. Da tut sich allerdings Nichts, da der MouseListener wohl falsch implementiert ist.

Meine beiden Klassen hänge ich mal an:


```
package UebungMitFrames;

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

import java.awt.Dimension;

public class JFrameIncludesJPanel /*extends JPanel*/ {
 
   int breite;
   int hoehe;
   String titel;
 
   public JFrameIncludesJPanel(int breite, int hoehe, String titel, InhaltJFrame jframe) {
   
     jframe.setPreferredSize(new Dimension(breite, hoehe));
     jframe.setMaximumSize(new Dimension(breite, hoehe));
     jframe.setMinimumSize(new Dimension(breite, hoehe));
   
     JFrame frame = new JFrame(titel);
   
     frame.add(jframe);
     frame.pack();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setLocationRelativeTo(null);
     frame.setResizable(false);
     frame.setVisible(true);
   
   
   }
 
 
 
 
   public static void main (String[] args) {
   
     new JFrameIncludesJPanel(800,600,"Test", new InhaltJFrame(800,600,25));
   
   }

}
```


```
package UebungMitFrames;

import java.awt.Graphics;
import java.awt.event.*;

import javax.swing.JPanel;

public class InhaltJFrame extends JPanel implements MouseListener {
   private static final long serialVersionUID = -3282658450774405410L;

   JPanel panel;
   int zaehlerw = 0;
   int zaehlerh = 0;
   int hoehe;
   int breite;
   int groesseQuadrat;
 
   public InhaltJFrame(int breite, int hoehe, int groesseQuadrat) {

     this.hoehe = hoehe;
     this.breite = breite;
     this.groesseQuadrat = groesseQuadrat;
     panel = new JPanel();
     panel.addMouseListener(this);
   }
 
   public void paint(Graphics g) {
     super.paint(g);
   
     int grenzeErsteFor = hoehe/groesseQuadrat;
     int grenzeZweiteFor = breite/groesseQuadrat;
   
     for (int j = zaehlerh; j < grenzeErsteFor; j++)
     {
       for (int i = zaehlerw; i < grenzeZweiteFor; i++)
       {
         g.drawRect(i*groesseQuadrat,j*groesseQuadrat,groesseQuadrat,groesseQuadrat);
       }
     }
   }

   public void mouseClicked(MouseEvent e) {
     zaehlerw = (e.getX()/groesseQuadrat);
     zaehlerh = (e.getY()/groesseQuadrat);
   
     repaint();
   }

 

   public void mouseEntered(MouseEvent e) {}

   public void mouseExited(MouseEvent e) {}

   public void mousePressed(MouseEvent e) {}

   public void mouseReleased(MouseEvent e) {}
 
 

}
```

Wäre nett, wenn mir jemand helfen könnte.

Viele Grüße
schiese


----------



## saftmeister (20. Juli 2014)

Schau mal hier, ob das für dich zutreffend ist: http://stackoverflow.com/questions/3382330/mouselistener-for-jpanel-missing-mouseclicked-events


----------



## schiese (20. Juli 2014)

Hallo,
das habe ich auch schon gefunden. Wenn ich allerdings in die anderen Methoden

```
public void mouseEntered(MouseEvent e) {}
   public void mouseExited(MouseEvent e) {}
   public void mousePressed(MouseEvent e) {}
   public void mouseReleased(MouseEvent e) {}
```
den Code einfüge tut sich auch nichts. Ich denke, ich habe da einen anderen Fehler. Vielleicht auch durch die Aufteilung des Codes in 2 Klassen.

Viele Grüße
schiese


----------



## saftmeister (20. Juli 2014)

Du könntest ja mal testen, was passiert, wenn du den MouseListener statt an das Panel, an das Frame anhängst.


----------



## youza (21. Juli 2014)

Du erweiterst ein Panel und erstellst in der Klasse einen membervariable panel!

du musst nur den Mouselistener wie folgt anhängen:

```
this.addMouseListener(this);
```

Die Klasse InhaltJFrame sieht dann wie folgt aus:


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

import javax.swing.JPanel;

public class InhaltJFrame extends JPanel implements MouseListener {
   private static final long serialVersionUID = -3282658450774405410L;

   int zaehlerw = 0;
   int zaehlerh = 0;
   int hoehe;
   int breite;
   int groesseQuadrat;

   public InhaltJFrame(int breite, int hoehe, int groesseQuadrat) {

     this.hoehe = hoehe;
     this.breite = breite;
     this.groesseQuadrat = groesseQuadrat;
     this.addMouseListener(this);
   }

   public void paint(Graphics g) {
     super.paint(g);
  
     int grenzeErsteFor = hoehe/groesseQuadrat;
     int grenzeZweiteFor = breite/groesseQuadrat;
  
     for (int j = zaehlerh; j < grenzeErsteFor; j++)
     {
       for (int i = zaehlerw; i < grenzeZweiteFor; i++)
       {
         g.drawRect(i*groesseQuadrat,j*groesseQuadrat,groesseQuadrat,groesseQuadrat);
       }
     }
   }

   public void mouseClicked(MouseEvent e) {
     zaehlerw = (e.getX()/groesseQuadrat);
     zaehlerh = (e.getY()/groesseQuadrat);
     repaint();
   }



   public void mouseEntered(MouseEvent e) {
    
   }

   public void mouseExited(MouseEvent e) {}

   public void mousePressed(MouseEvent e) {}

   public void mouseReleased(MouseEvent e) {}



}
```

Du musst kein JPanel erstellen da die Klasse selbst von JPanel erbt und somit ein JPanel ist.

Viele Grüße
Youza


----------



## schiese (21. Juli 2014)

Hallo Youza,

vielen Dank. So funktioniert es. Das mit dem Vererben habe ich noch nicht so ganz drauf. Aber das kommt noch 

Ich habe jetzt mal ein kleines anderes Programm geschrieben, das die Kästchen schwarz einfärbt, auf die man klickt. Das Programm ist eigentlich egal, es geht mir ums Prinzip. In Java sollte man ja möglichst viel in eine Klassen auslagern. So habe ich versucht, den MouseListener in eine separate Klasse zu packen, um die Zeichnung des Bildes und die Überwachung der Mausklicks zu trennen. Dies funktioniert aber nicht, da ich im Falle eines Mausklicks nicht die repaint()-Methode aufrufen kann, da die ja in der anderen Klasse ist.

Wie handhabt man das am besten? Oder belässt man es bei den 2 Klassen?


```
package UebungMitFrames;

import java.awt.Dimension;

import javax.swing.JFrame;

public class ML extends JFrame {
   private static final long serialVersionUID = -4967020736266710674L;
 
   public static void main(String[] args) {
     new ML(800, 600, "Test MouseListener");
   }
 
   public ML(int breite, int hoehe, String titel) {
   
     super(titel);

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
     this.setPreferredSize(new Dimension(breite+7,hoehe+29));
     this.setMaximumSize(new Dimension(breite+7,hoehe+29));
     this.setMinimumSize(new Dimension(breite+7,hoehe+29));

     this.setLocationRelativeTo(null);
     this.setResizable(false);
     this.add(new Inhalt(breite, hoehe));
     this.setVisible(true);
   
   }

}
```


```
package UebungMitFrames;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;

import javax.swing.JPanel;

public class Inhalt extends JPanel implements MouseListener {
   private static final long serialVersionUID = -1629662629441512391L;
 
   int groesseQuadrat = 50;
   int zaehlerW = 0;
   int zaehlerH = 0;
 
   int hoehe = 600;
   int breite = 800;
 
   boolean pruefung = false;
 
   Point p;
   LinkedList<Point> list = new LinkedList<Point>();
 
   public Inhalt (int breite, int hoehe) {
     this.setPreferredSize(new Dimension(breite,hoehe));
     this.setVisible(true);
     this.addMouseListener(this);
   }
 
   public void paint(Graphics g) {
 
   super.paint(g);
 
   for (int j = 0; j < hoehe; j+=groesseQuadrat)
   {
     for (int i = 0; i < breite; i+=groesseQuadrat)
     {
       if (list.size() > 0)
       {
       for (int k = 0; k < list.size(); k++)
       {
         if (((int)list.get(k).getY() > j && (int)list.get(k).getY() < (j+groesseQuadrat)) && ((int)list.get(k).getX() > i && (int)list.get(k).getX() < (i+groesseQuadrat)))
         {
           g.fillRect(i, j, groesseQuadrat, groesseQuadrat);
         } else {
           g.drawRect(i, j, groesseQuadrat,groesseQuadrat);
         }
       }
       } else {
         g.drawRect(i, j, groesseQuadrat,groesseQuadrat);
       }
     }
   }
}
 
   public void setZaehlerW(int z) {
     zaehlerW = z;
   }
 
   public void setZaehlerH(int z) {
     zaehlerH = z;
   }
 
   public void setPoint(Point p) {
     list.add(p);
   }
 
   @Override
   public void mouseClicked(MouseEvent e) {
   
     setZaehlerW(e.getX());
     setZaehlerH(e.getY());
   
     setPoint(e.getPoint());
   
     repaint();
   
     System.out.println("x: "+(e.getX())+" - y: "+(e.getY()));
   }
 
   public void mouseEntered(MouseEvent arg0) {}
   public void mouseExited(MouseEvent arg0) {}
   public void mousePressed(MouseEvent arg0) {}
   public void mouseReleased(MouseEvent arg0) {}
}
```

Viele Grüße
schiese


----------



## youza (21. Juli 2014)

Du kannst es wie folgt machen:


Die Klasse Inhalt:

```
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;

import javax.swing.JPanel;

public class Inhalt extends JPanel {
   private static final long serialVersionUID = -1629662629441512391L;

   int groesseQuadrat = 50;
   int zaehlerW = 0;
   int zaehlerH = 0;

   int hoehe = 600;
   int breite = 800;

   boolean pruefung = false;

   Point p;
   LinkedList<Point> list = new LinkedList<Point>();

   public Inhalt (int breite, int hoehe) {
     this.setPreferredSize(new Dimension(breite,hoehe));
     this.setVisible(true);
     this.addMouseListener(new MyMouseListener(this));
   }

   public void paint(Graphics g) {

   super.paint(g);

   for (int j = 0; j < hoehe; j+=groesseQuadrat)
   {
     for (int i = 0; i < breite; i+=groesseQuadrat)
     {
       if (list.size() > 0)
       {
       for (int k = 0; k < list.size(); k++)
       {
         if (((int)list.get(k).getY() > j && (int)list.get(k).getY() < (j+groesseQuadrat)) && ((int)list.get(k).getX() > i && (int)list.get(k).getX() < (i+groesseQuadrat)))
         {
           g.fillRect(i, j, groesseQuadrat, groesseQuadrat);
         } else {
           g.drawRect(i, j, groesseQuadrat,groesseQuadrat);
         }
       }
       } else {
         g.drawRect(i, j, groesseQuadrat,groesseQuadrat);
       }
     }
   }
}

   public void setZaehlerW(int z) {
     zaehlerW = z;
   }

   public void setZaehlerH(int z) {
     zaehlerH = z;
   }

   public void setPoint(Point p) {
     list.add(p);
   }
}
```

Die Hauptklasse:

```
import java.awt.Dimension;

import javax.swing.JFrame;

public class ML extends JFrame {
   private static final long serialVersionUID = -4967020736266710674L;

   public static void main(String[] args) {
     new ML(800, 600, "Test MouseListener");
   }

   public ML(int breite, int hoehe, String titel) {
  
     super(titel);

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
     this.setPreferredSize(new Dimension(breite+7,hoehe+29));
     this.setMaximumSize(new Dimension(breite+7,hoehe+29));
     this.setMinimumSize(new Dimension(breite+7,hoehe+29));

     this.setLocationRelativeTo(null);
     this.setResizable(false);
     this.add(new Inhalt(breite, hoehe));
     this.setVisible(true);
  
   }

}
```

Der MouseListener:


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

public class MyMouseListener implements MouseListener{
    private Inhalt parent;
    public MyMouseListener(Inhalt parent){
        this.parent = parent;
    }

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

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

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

    @Override
    public void mousePressed(MouseEvent e) {
        parent.setZaehlerW(e.getX());
        parent.setZaehlerH(e.getY());
    
        parent.setPoint(e.getPoint());
    
        parent.repaint();
    
        System.out.println("x: "+(e.getX())+" - y: "+(e.getY()));
      
    }

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

}
```

Viele Grüße
Youza


----------

