Okay, der Titel hört sich komisch an; ich habe ein Fenster, RectangleDrawer, auf das ich mit der Maus mehrere Rechtecke zeichnen kann. Da beim Painten alle gezogenen Fenster erscheinen sollen und nicht nur das letzte, habe ich einen Vector paintList, in den ich alle Elemente hineinstecke. Links oben wird immer angezeigt, wie viele Elemente (Rectangles) der Vector besitzt.
Das Programm funktioniert - aber während des Draggens, also des Ziehens mit der Maus soll das Rechteck ja auch schon agezeigt werden. Deswegen muss bei jedem Aufruf der mouseDragged-Methode also an den Vector ein weiteres Rectangle angehängt werden.
[Die Aufrufreihenfolge der Methoden ist also mousePressed - der Klick, öfters mouseDragged - das Ziehen und am Ende mouseReleased - das Loslassen.]
Es funktioniert zwar alles gut, aber ich habe schon nach ein paar mal Zeichnen extrem viele Elemente im Vector.
So sieht der Code aus:
Gibt es eine bessere, performantere Alternative, bei der die paintList nicht so voll ist?
Am besten ist vielleicht, ihr kopiert euch den Code in Eclipse o.ä. und probiert ihn einmal aus.
Danke im Voraus, und besonders, wenn ihr euch meinen langen Code durchlest ^^'
Das Programm funktioniert - aber während des Draggens, also des Ziehens mit der Maus soll das Rechteck ja auch schon agezeigt werden. Deswegen muss bei jedem Aufruf der mouseDragged-Methode also an den Vector ein weiteres Rectangle angehängt werden.
[Die Aufrufreihenfolge der Methoden ist also mousePressed - der Klick, öfters mouseDragged - das Ziehen und am Ende mouseReleased - das Loslassen.]
Es funktioniert zwar alles gut, aber ich habe schon nach ein paar mal Zeichnen extrem viele Elemente im Vector.
So sieht der Code aus:
Java:
package test.gui;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
/* RectangleDrawer
* Erlaubt es, dass auf einem Frame mit der Maus
* Rechtecke gezogen werden können.
*/
class RectangleDrawer extends Frame
{
private static Color backColor = new Color(240, 240, 240);//Hintergrundfensterfarbe
private Vector<Rectangle> paintList; //damit paint alles erneut zeichnen kann und nicht nur das letzte
private Rectangle curRect; //das aktuell zu zeichnende Viereck
public static void main(String[] args)
{
RectangleDrawer mainWnd = new RectangleDrawer();
mainWnd.curRect = new Rectangle(0, 0, 0, 0); //Init.
mainWnd.paintList = new Vector<Rectangle>(); //Init.
}
//Konstruktor
public RectangleDrawer()
{
super("Rectangle Drawer!");
setBackground(backColor);
setSize(350, 250);
setResizable(false);
addMouseListener(new MyMouseListener());
addMouseMotionListener(new MyMouseDragListener());
setVisible(true);
}
public void paint(Graphics g)
{
g.drawString(String.valueOf(paintList.size()), getInsets().left+ 3, getInsets().top +10); //Schreibt Elemente
if (!paintList.isEmpty())
{
// Zeichnet jedes Rechteck aus der Liste auf das Fenster
for (Iterator<Rectangle> it = paintList.iterator(); it.hasNext();)
{
Rectangle rect = it.next();
g.drawRect(rect.x, rect.y, rect.width, rect.height);
}
}
}
class MyMouseListener
extends MouseAdapter
{
//Beim ersten Klick gettet es die Klick-Koordinaten, also die Stelle,
//an der das Rechteck beginnt.
@Override
public void mousePressed(MouseEvent event)
{
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
curRect = new Rectangle(event.getX(), event.getY(), 0, 0);
}
//Ergibt beim Loslassen der Maustatse das letztendlich Rechteck
@Override
public void mouseReleased(MouseEvent event)
{
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
paintList.add(curRect);
repaint();
}
}
class MyMouseDragListener
extends MouseMotionAdapter
{
//Berechnet, wie lang das Rechteck sein muss und lässt es zeichnen
// - während des Ziehens
@Override
public void mouseDragged(MouseEvent event)
{
curRect.width = event.getX() - curRect.x;
curRect.height = event.getY() - curRect.y;
paintList.add(curRect);
repaint();
}
}
}
Gibt es eine bessere, performantere Alternative, bei der die paintList nicht so voll ist?
Am besten ist vielleicht, ihr kopiert euch den Code in Eclipse o.ä. und probiert ihn einmal aus.
Danke im Voraus, und besonders, wenn ihr euch meinen langen Code durchlest ^^'
Zuletzt bearbeitet: