# Kreis nach Mausklick zeichnen



## Cosma (18. Feb 2012)

Hallo,
gleich zu Anfang ich bin in Java sehr schlecht also habt bitte Nachsicht 
Ich will ein Programm schreiben, wo ich in mein Panel reinklicken kann und dann dort ein Kreis gezeichnet wird. 

Ich bin ein bisschen überfordert, da ich nicht genau weiß, wo ich das genau 'hinschreibe'...


```
package endprojekt;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class Endprojekt extends JFrame implements ActionListener, MouseListener {
    
    JFrame hansi;
    zeichenpanel zeichnung;
    JButton farbeaendern;
    JButton koordinatenspeichern;
    JPanel buttonpanel;
    
    

    public static void main(String[] args) {
        Endprojekt project=new Endprojekt();
        project.los();
        
        
        
    }
    
    
    
    public void los()
    {
        hansi=new JFrame();
        hansi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        zeichnung=new zeichenpanel();
        hansi.getContentPane().add(BorderLayout.CENTER,zeichnung);
        
    
        
        
        hansi.setBackground(Color.WHITE);
        hansi.setSize(600,600);
        
        buttonpanel=new JPanel();
        farbeaendern=new JButton("Farbe ändern");
        
        koordinatenspeichern=new JButton("Koordinaten speichern");
        buttonpanel.add(farbeaendern);
        buttonpanel.add(koordinatenspeichern);
        buttonpanel.setLayout(new GridLayout(1,2));
        hansi.getContentPane().add(BorderLayout.SOUTH,buttonpanel);
      
        
        hansi.setVisible(true);
        
        
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        Graphics g=getGraphics();
        int x=e.getX();
        int y=e.getY();
        g.setColor(Color.red);
        g.drawOval(x, y, 15, 15);
        
        zeichnung.repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {
       
    }

    @Override
    public void mouseReleased(MouseEvent e) {
       
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
        
    }
    
    
    
}
```


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package endprojekt;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;

/**
 *
 * @author Administrator
 */
public class zeichenpanel extends JPanel {
    
    
    
    
    @Override
       public void paintComponent(Graphics g)
    {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, this.getWidth() , this.getHeight());
        

         
    }
    
    
}
```

Meine konkrete Frage ist, ob ich das bei MouseClicked richtig definiert habe oder ich das in paintComponent machen muss?!

Ich hoffe ihr könnt mir ein bisschen weiterhelfen


----------



## Marco13 (18. Feb 2012)

[WR]Nicht auf components 'getGraphics' aufrufen![/WR]

In diesem Fall wäre der Ablauf eher so, dass in der 'mouseClicked'-Methode z.B. ein Objekt erstellt wird (hier wohl nur ein "Point") und dieses Objekt dann ans ZeichenPanel weitergreicht wird. Dann ruft man zeichenPanel.repaint() auf, und das Zeichenpanel zeichnet das Objekt.

Kannst dir auch mal http://www.java-forum.org/entwuerfe/113007-kein-swing-tutorial-2.html#post806479 ansehen - das geht schon in diese Richtung. (Aber auch berücksichtigen, ob es in Zukunft mehrere Objekte geben wird und so - siehe auch die auf den obigen folgenden Beiträge)


----------



## uranus-home (18. Feb 2012)

So vielleicht?



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

class KreisMalen extends MouseAdapter {
  Zeichnung z = new Zeichnung();
  JFrame frame = new JFrame("KreisMalen");
  int x = 0;
  int y = 0;
  public KreisMalen() {
    frame.add(z);
    frame.addMouseListener(this);
    frame.setSize(300,300);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
  public void mousePressed(MouseEvent evt) {
    x = evt.getX() - 20;
    y = evt.getY() - 30;
    frame.repaint();
  }
  class Zeichnung extends JPanel {
    public void paintComponent(Graphics g) {
      g.fillOval(x,y,20,20);
    }
  }
  public static void main(String[] args) {
    new KreisMalen();
  }
}
```


----------



## Cosma (21. Feb 2012)

uranus-home hat gesagt.:


> So vielleicht?
> 
> 
> 
> ...



Das hat mir schon mal weiter geholfen, danke! 
Nur hier wird der Kreis wenn ich ein 2. Mal hinein klicke dann auf diese Position gesetzt. Wie mache ich das dann damit ich wenn ich ein 2. Mal Klicke ein 2. Kreis gezeichnet wird und der erste dort bleibt?


----------



## truesoul (21. Feb 2012)

Hallo.

Zum Beispiel indem du eine Collection verwendest, die die Kreise speichert ( hält ), und du dann aus der Liste zeichnest.


----------



## Cosma (21. Feb 2012)

Ok es hat sich erledigt, ich habe es geschafft. Wahrscheinlich eine Pfuschlösung aber so kann ich wenigstens weitermachen und es wieder selbst reproduzieren


----------

