G
Guest
Gast
In folgendem Beispiel werden Kreise (Mittelpunkt: MousePressed; Rand: MouseReleased) auf ein JPanel gezeichnet.
Diese werden in einer Liste gespeichert.
Nun sollen die Kreise für die weitere Verwendung per Rechtsklick einzeln ausgewählt werden.
Wie ich rausfinde ob die linke oder rechte Maustaste gedrückt wurde, das hab ich ja mittlerweile raus gefunden.
Ebenso der Punkt an dem gedrückt wurde.
Aber wie kann ich einen so "angewählten" Kreis ansprechen?
Diese werden in einer Liste gespeichert.
Nun sollen die Kreise für die weitere Verwendung per Rechtsklick einzeln ausgewählt werden.
Wie ich rausfinde ob die linke oder rechte Maustaste gedrückt wurde, das hab ich ja mittlerweile raus gefunden.
Ebenso der Punkt an dem gedrückt wurde.
Aber wie kann ich einen so "angewählten" Kreis ansprechen?
Code:
import java.awt.Color;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
public class GrafikObjekt
{
Shape shape;
Color color;
GrafikObjekt(Shape se)
{
shape=se;
}
}
-----------------------------------------------------------------------
import java.util.ArrayList;
import javax.swing.JFrame;
/**
* Ein Kreiseditor verknüpft alle Objekte sinnvoll miteinander.
*/
public class KreisEditor
{
public static void main(String[] args)
{
ArrayList<GrafikObjekt> ll=new ArrayList<GrafikObjekt>();
ZeichenPanel zp=new ZeichenPanel(ll);
KreisZeichner kz=new KreisZeichner(zp,ll);
zp.addMouseListener(kz);
JFrame jf=new JFrame();
jf.add(zp);
jf.pack();
jf.setVisible(true);
}
}
------------------------------------------------------------------------
import java.awt.Color;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
/**Ein KreisZeichner erstellt einen Kreis mit dem Radius, der zwischen den
* beiden Punkten entsteht, an denen die Maus gedrückt und losgelassen wird.
* Den Kreis wird in einem GrafikObjekt abgespeichert und das widerum in einem
* ArrayList-Objekt.
* Der KreisZeichner erhält bei seiner Erzeugung ein ArrayList-Objekt und
* speichert es als seine Eigenschaft.
*/
public class KreisZeichner extends MouseAdapter
{
private Point mittelpunkt=new Point();
private Point startpunkt=new Point();
Ellipse2D.Double kreis;
ArrayList<GrafikObjekt> ll;
ZeichenPanel view;
//Hier werden alle Kreise gespeichert:
public KreisZeichner(ZeichenPanel view,ArrayList<GrafikObjekt> ll)
{
this.ll=ll;
this.view=view;
}
//Wird die Maus gedrückt, merkt sich der KreisZeichner die Position:
public void mousePressed(MouseEvent e)
{
mittelpunkt=e.getPoint();
}
/**Wird die Maus losgelassen, berechnet der KreisZeichner die direkte
* Entfernung, die die Maus zurückgelegt hat. Diese Entfernung wird einem
* Ellipse2D Objekt als Parameter mitgegeben, das beim Ausführen dieser Methode
* erschaffen wird. Dieses wird dann in einem GrafikObjekt gespeichert, welches
* der ArrayList angehängt wird.
*/
public void mouseReleased(MouseEvent e)
{
double r=e.getPoint().distance(mittelpunkt);
startpunkt.x=mittelpunkt.x-(int)r;
startpunkt.y=mittelpunkt.y-(int)r;
Ellipse2D.Double kreis=new Ellipse2D.Double(startpunkt.x, startpunkt.y, 2*r, 2*r);
GrafikObjekt go=new GrafikObjekt(kreis);
//Hier wird dir Farbe der Kreise fest gelegt; HIER per Zufall:
Color color=new Color((float)Math.random(),(float)Math.random(),(float)Math.random());
go.color=color;
ll.add(go);
view.repaint();
}
public void mouseClicked(MouseEvent e)
{
e.getButton();
e.getPoint();
System.out.println(e);
}
}
----------------------------------------------------------------------------------------
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JPanel;
/**
* Ein ZeichenPanel ist ein JPanel, das mehrere Kreise zeichnen kann.
*/
class ZeichenPanel extends JPanel
{
ArrayList<GrafikObjekt> ll;
/**Ein ZeichenPanel wird mit einer Größe von (700,500) erschaffen
* und speichert die ihm übergebene ArrayList als Eigenschaft ab.
* @param ll Hier sind alle Kreise gespeichert.
*/
ZeichenPanel(ArrayList<GrafikObjekt> ll)
{
this.ll=ll;
setPreferredSize(new Dimension(700,500));
}
/**Soll sich ein ZeichenPanel zeichnen, zeichnet erst einmal das JPanel
* und dann werden alle in der ArrayList gespeicherten Kreise gezeichnet.
*/
public void paint(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
super.paint(g2);
RenderingHints hints=new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.addRenderingHints(hints);
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
//Hier werden Strichbreite,- und Art der Kreise fest gelegt:
//BasicStroke bsGestrichelt=new BasicStroke(2, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 1, new float[]{20},0);
BasicStroke bs=new BasicStroke(1);
g2.setStroke(bs);
//Die Kreise werden mittels einer For(Each)-Schleife gezeichnet:
for(GrafikObjekt t:ll)
{
g2.setColor(t.color);
g2.draw(t.shape);
}
}
}