Collection Framework

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
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());
}
}
 
Also das war eigentlich das größte Problem...aber wenn die Liste Ihre Größe alleine verändert, scheint es ja gar nicht so kompliziert zu sein, wie ich dachte...
Versuche grade rauszufinden, wie man einer neu erzeugten Liste Objekte anhängt...
Da fehlt mir irgendwie die Syntax für...aber gucke grade bei Java ist eine Insel und Internet, mal sehen...
Dann müsste es eigentlich schon so gut wie klappen...zumindest hab ich die Kreise dann in meiner Liste...das ist schonmal die halbe Miete...
 
Allerbesten dank, das hat funktioniert... 😀

Jetzt bin ich dabei die erzeugten und der Liste hinzugefügten Kreise im Panel bzw. auf Image zu zeichnen.
dazu will ich ne For-Schleife benutzen muss aber erstmal die Größe des Feldes bzw. der Liste ruas kriegen.

Das es mit get.Length hier nicht geht hab ich irgendwie schon gemerkt, aber getSize() get auch nicht!?

Wie kriege ich dir Länge (Anzahl der Objekte) der Liste raus?
Müsste dann eigentlich alleine klar kommen!

*sich hier vorab schonmal für die Hilfe bedanken tut*
 
Komisch irgendwie will er das nicht...er kommt bei mir nur mit size() klar...aber ohne get() 😛
 
Ja, die gute alte API! 🙂 So.... *sich freut* Jetzt kommt die Methode LöscheLetzenKreis() 🙂
Aber denke mal jetzt komm ich klar!
Danke nochmal for the help!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben