G
Guest
Gast
Für ein kleines Zeichenprogramm sollen unter anderem Kreise, Linien, Ovale etc. auf einem Image gezeichnet werden...
Nun funktioiert das meißte so schon, allerdings kann man einen falsch eingezeichneten Kreis nicht wieder
rückgänging machen bzw. löschen.
Das soll geschehen, in dem die Kreise in ein "Array" gespeichert, werden, so dass man indiziert auf die einzelnen Kreise zugreifen kann...
Dazu hab ich mir das Collection Framework angesehen und denke von "Collection", "Set", "Queue", "Map" wäre das beste einfach "List"...aber irgendwie fehlt mir der Ansatz dazu...
Vielleicht findet ja jemand die Zeit sich dies anzusehen und mir zu empfehlen, wie ich das angehen könnte...
Also rein von der Logik her, die LinkedList wird mit einem Objekt, zum Beispiel Kreis gefüllt, so bald einer erzeugt wird.
Das erste Problem was bei mir auftaucht, woher weiß ich wie groß die Liste ist, wenn ich nicht weiß, wie wieviele Kreise der Benutzer aufziehen will...
Naja...hier auf jeden fall der jetztige Stand der Dinge:
Mein JFrame:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
class MeinJFrame extends JPanel
{
private Kreise kreis=null;
private Image image; //Auf dieses Image werden die Kreise gezeichnet
private Graphics2D g2; //Das ist der Graphics Kontext vom Image
MeinJFrame()
{
addMouseListener(new MouseAdapter()
{
//Die Methode mousePressed des MouseListeners wird "definiert":
public void mousePressed(MouseEvent event)
{
//Beim drücken der Maustaste wird ein neuer Kreis mit den Eigenschaften
//Radius=0 und Farbe=null erzeugt:
kreis=new Kreise(0, null);
//X,-und Y-Koordinaten des Events (Maustaste gedrückt) werden festgehalten:
kreis.x=event.getX();
kreis.y=event.getY();
//Mittelpunkt des Kreises mit einem Radius von 1 und der Farbe grün
//zeichnen, dient als Anhaltspunkt für das Aufziehen:
kreis.color=Color.green;
kreis.radius=1;
kreisZeichnen();
}
//Die Methode mouseReleased des MouseListeners wird "definiert":
public void mouseReleased(MouseEvent event)
{
//Die Farbe des Kreises wird bestimmt:
kreis.color=Color.red;
//Der Mittelpunkt wird festgelegt(Dort wo die Maustaste gedrückt wurde:
Point mittelpunkt=new Point(kreis.x, kreis.y);
//Der Radius vom Kreis wird gesetzt=Distanz zwischen Mittelpunkt und dem Punkt beim loslassen der Maustaste:
kreis.radius=(int)(mittelpunkt).distance(event.getPoint());
//Kreis zeichnen:
kreisZeichnen();
}
});
}
public void paintComponent(Graphics g)
{
//paintComponent zeichnet einfach immer nur das Image,
//nur so bleibt die Zeichnung bei jedem "repaint" erhalten:
if (image==null)
{
image=createImage(getWidth(), getHeight());
g2=(Graphics2D)image.getGraphics();
}
Rectangle r=g.getClipBounds();
g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y, r.x, r.y, r.width+r.x, r.height+r.y, null);
}
//Folgende Aktionen werden ausgeführt, wenn die Maustaste gedrückt wird:
public void mousePressed(MouseEvent event)
{
//Beim drücken der Maustaste wird ein neuer Kreis mit den Eigenschaften
//Radius=0 und Farbe=null erzeugt:
kreis=new Kreise(0, null);
//X,-und Y-Koordinaten des Events (Maustaste gedrückt) werden festgehalten:
kreis.x=event.getX();
kreis.y=event.getY();
//Mittelpunkt des Kreises mit einem Radius von 1 und der Farbe grün
//zeichnen, dient als Anhaltspunkt für das Aufziehen:
kreis.color=Color.green;
kreis.radius=1;
kreisZeichnen();
}
//Folgende Aktionen werden ausgeführt, wenn die Maustaste losgelassen wird:
public void mouseReleased(MouseEvent event)
{
//Die Farbe des Kreises wird bestimmt:
kreis.color=Color.red;
//Der Mittelpunkt wird festgelegt(Dort wo die Maustaste gedrückt wurde:
Point mittelpunkt=new Point(kreis.x, kreis.y);
//Der Radius vom Kreis wird gesetzt=Distanz zwischen Mittelpunkt und dem Punkt beim loslassen der Maustaste:
kreis.radius=(int)(mittelpunkt).distance(event.getPoint());
//Kreis zeichnen:
kreisZeichnen();
}
//Die Methode zum zeichnen eines Kreises:
private void kreisZeichnen()
{
//Die Farbe des Kreises wird bestimmt:
g2.setColor(kreis.color);
//Der Kreis wird gefüllt:
g2.fillOval(kreis.x-kreis.radius, kreis.y-kreis.radius, kreis.radius*2, kreis.radius*2);
//Da normalerweise die Ausgabe nicht weichgezeichnet ist, setzen wir dies durch setRenderingHint:
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
repaint();
}
}
------------------------------------------------------------------------------------------------------------------------------
Die Klasse Kreise:
import java.awt.Color;//Die Klasse Kreise, definiert die Eigenschaften eines solchen:
class Kreise { int x;
int y;
int radius;
Color color;
Kreise(int radius, Color color)
{
this.radius=radius;
this.color=color;
}
}
-------------------------------------------------------------------------------------------------------------------------------
Und die Main():
import javax.swing.JFrame;
class KreisTester extends JFrame
{
//Einstiegspunkt in das Programm:
static public void main(String[] args)
{
//Ein neues Fenster wird erzeugt und sichtbar gemacht:
JFrame mainFrame=new KreisTester();
mainFrame.setVisible(true);
}
//Das Fenster wird definert:
public KreisTester()
{
//Titel:
setTitle("Hausaufgabe Kreis aufziehen");
//Größe:
setSize(700,600);
//Inhalt:
getContentPane().add(new MeinJFrame());
}
}
Nun funktioiert das meißte so schon, allerdings kann man einen falsch eingezeichneten Kreis nicht wieder
rückgänging machen bzw. löschen.
Das soll geschehen, in dem die Kreise in ein "Array" gespeichert, werden, so dass man indiziert auf die einzelnen Kreise zugreifen kann...
Dazu hab ich mir das Collection Framework angesehen und denke von "Collection", "Set", "Queue", "Map" wäre das beste einfach "List"...aber irgendwie fehlt mir der Ansatz dazu...
Vielleicht findet ja jemand die Zeit sich dies anzusehen und mir zu empfehlen, wie ich das angehen könnte...
Also rein von der Logik her, die LinkedList wird mit einem Objekt, zum Beispiel Kreis gefüllt, so bald einer erzeugt wird.
Das erste Problem was bei mir auftaucht, woher weiß ich wie groß die Liste ist, wenn ich nicht weiß, wie wieviele Kreise der Benutzer aufziehen will...
Naja...hier auf jeden fall der jetztige Stand der Dinge:
Mein JFrame:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
class MeinJFrame extends JPanel
{
private Kreise kreis=null;
private Image image; //Auf dieses Image werden die Kreise gezeichnet
private Graphics2D g2; //Das ist der Graphics Kontext vom Image
MeinJFrame()
{
addMouseListener(new MouseAdapter()
{
//Die Methode mousePressed des MouseListeners wird "definiert":
public void mousePressed(MouseEvent event)
{
//Beim drücken der Maustaste wird ein neuer Kreis mit den Eigenschaften
//Radius=0 und Farbe=null erzeugt:
kreis=new Kreise(0, null);
//X,-und Y-Koordinaten des Events (Maustaste gedrückt) werden festgehalten:
kreis.x=event.getX();
kreis.y=event.getY();
//Mittelpunkt des Kreises mit einem Radius von 1 und der Farbe grün
//zeichnen, dient als Anhaltspunkt für das Aufziehen:
kreis.color=Color.green;
kreis.radius=1;
kreisZeichnen();
}
//Die Methode mouseReleased des MouseListeners wird "definiert":
public void mouseReleased(MouseEvent event)
{
//Die Farbe des Kreises wird bestimmt:
kreis.color=Color.red;
//Der Mittelpunkt wird festgelegt(Dort wo die Maustaste gedrückt wurde:
Point mittelpunkt=new Point(kreis.x, kreis.y);
//Der Radius vom Kreis wird gesetzt=Distanz zwischen Mittelpunkt und dem Punkt beim loslassen der Maustaste:
kreis.radius=(int)(mittelpunkt).distance(event.getPoint());
//Kreis zeichnen:
kreisZeichnen();
}
});
}
public void paintComponent(Graphics g)
{
//paintComponent zeichnet einfach immer nur das Image,
//nur so bleibt die Zeichnung bei jedem "repaint" erhalten:
if (image==null)
{
image=createImage(getWidth(), getHeight());
g2=(Graphics2D)image.getGraphics();
}
Rectangle r=g.getClipBounds();
g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y, r.x, r.y, r.width+r.x, r.height+r.y, null);
}
//Folgende Aktionen werden ausgeführt, wenn die Maustaste gedrückt wird:
public void mousePressed(MouseEvent event)
{
//Beim drücken der Maustaste wird ein neuer Kreis mit den Eigenschaften
//Radius=0 und Farbe=null erzeugt:
kreis=new Kreise(0, null);
//X,-und Y-Koordinaten des Events (Maustaste gedrückt) werden festgehalten:
kreis.x=event.getX();
kreis.y=event.getY();
//Mittelpunkt des Kreises mit einem Radius von 1 und der Farbe grün
//zeichnen, dient als Anhaltspunkt für das Aufziehen:
kreis.color=Color.green;
kreis.radius=1;
kreisZeichnen();
}
//Folgende Aktionen werden ausgeführt, wenn die Maustaste losgelassen wird:
public void mouseReleased(MouseEvent event)
{
//Die Farbe des Kreises wird bestimmt:
kreis.color=Color.red;
//Der Mittelpunkt wird festgelegt(Dort wo die Maustaste gedrückt wurde:
Point mittelpunkt=new Point(kreis.x, kreis.y);
//Der Radius vom Kreis wird gesetzt=Distanz zwischen Mittelpunkt und dem Punkt beim loslassen der Maustaste:
kreis.radius=(int)(mittelpunkt).distance(event.getPoint());
//Kreis zeichnen:
kreisZeichnen();
}
//Die Methode zum zeichnen eines Kreises:
private void kreisZeichnen()
{
//Die Farbe des Kreises wird bestimmt:
g2.setColor(kreis.color);
//Der Kreis wird gefüllt:
g2.fillOval(kreis.x-kreis.radius, kreis.y-kreis.radius, kreis.radius*2, kreis.radius*2);
//Da normalerweise die Ausgabe nicht weichgezeichnet ist, setzen wir dies durch setRenderingHint:
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
repaint();
}
}
------------------------------------------------------------------------------------------------------------------------------
Die Klasse Kreise:
import java.awt.Color;//Die Klasse Kreise, definiert die Eigenschaften eines solchen:
class Kreise { int x;
int y;
int radius;
Color color;
Kreise(int radius, Color color)
{
this.radius=radius;
this.color=color;
}
}
-------------------------------------------------------------------------------------------------------------------------------
Und die Main():
import javax.swing.JFrame;
class KreisTester extends JFrame
{
//Einstiegspunkt in das Programm:
static public void main(String[] args)
{
//Ein neues Fenster wird erzeugt und sichtbar gemacht:
JFrame mainFrame=new KreisTester();
mainFrame.setVisible(true);
}
//Das Fenster wird definert:
public KreisTester()
{
//Titel:
setTitle("Hausaufgabe Kreis aufziehen");
//Größe:
setSize(700,600);
//Inhalt:
getContentPane().add(new MeinJFrame());
}
}