Hallo zusammen,
ich habe ein so unglaublich beschissenes Problem, dass ich echt nicht mehr weiter weiß. In meinem Editor will ich Boxen, Linien, Pfeile und auch einfach nur feste Image-Objekte malen und anschließend verschieben bzw. löschen können.
Irgendwie will aber schon das Erstgenannte nicht richtig gelingen. Sobald ich z.B. meine Box anfange zu male, wird jeder Schritt des Malverlaufs mitgemalt. Soll heißen: am Ende habe ich nicht eine große Box, sondern während des Dragvorgangs werden unzählig viele kleine Boxen gemalt, bis die Endposition erreicht ist.
Ich hoffe das ist einigermaßen verständlich
Zu Beginn habe ich gedacht, dass alles mit der XOR-Methode klappen sollte. Tat es auch, bis ich den schwarzen Hintergrund durch ein Hintergrundbild ersetzt habe. Jetzt mischt sich die Farbe beim Malprozess mit dem Hintergrundbild. Das Ganze sieht einfach beschissen aus.
Der Malprozess sieht grob gesagt wie folgt aus:
Die Mousevents werden abgefragt, sobald geklickt oder gedragged wurde, passiert folgendes
Die folgende Klasse ist die Box-Klasse, die das Zeichnen erledigt
Dieses Inteface habe ich übersichtshalber mitgeführt
Das Problem liegt wirklich nur beim Zeichnen, da jeder Schritt des Malprozesses gezeichnet wird.
Ich weiß, dass es viel Code ist und wohl unübersichtlich. Dennoch hoffe ich, dass ihr durch mein Problem durchschaut und mir helfen könnt. TAUSEND DANK
ich habe ein so unglaublich beschissenes Problem, dass ich echt nicht mehr weiter weiß. In meinem Editor will ich Boxen, Linien, Pfeile und auch einfach nur feste Image-Objekte malen und anschließend verschieben bzw. löschen können.
Irgendwie will aber schon das Erstgenannte nicht richtig gelingen. Sobald ich z.B. meine Box anfange zu male, wird jeder Schritt des Malverlaufs mitgemalt. Soll heißen: am Ende habe ich nicht eine große Box, sondern während des Dragvorgangs werden unzählig viele kleine Boxen gemalt, bis die Endposition erreicht ist.
Ich hoffe das ist einigermaßen verständlich
Zu Beginn habe ich gedacht, dass alles mit der XOR-Methode klappen sollte. Tat es auch, bis ich den schwarzen Hintergrund durch ein Hintergrundbild ersetzt habe. Jetzt mischt sich die Farbe beim Malprozess mit dem Hintergrundbild. Das Ganze sieht einfach beschissen aus.
Der Malprozess sieht grob gesagt wie folgt aus:
Die Mousevents werden abgefragt, sobald geklickt oder gedragged wurde, passiert folgendes
Code:
// in dieser Klasse werden die Mouseereignisse abgefangen
public class ShapesDraw implements MouseListener, MouseMotionListener{
...
protected MyGraphicDisplay grCanvas; // Display where all drawing action takes place
private Drawable shape; // ? Drawable is an interface in folder "shapes"
....
public void mouseDragged(MouseEvent e){
if(SwingUtilities.isRightMouseButton(e)) return;
int x = e.getX();
int y = e.getY();
drawGraphics(x,y);
}
//Draws graphics when mouse is dragged. There is no text drawing when mouse is dragged.
protected void drawGraphics(int x, int y) {
switch (currentCommand) {
case ShapesDrawController.DRAW : // order is to draw
if((shapesOn) &&(shape != null)) {
shape.setCurrentPosition(new Point(x,y));
shape.drawInteractive(grCanvas.getDisplayedImageGraphic());
grCanvas.repaint();
}
break;
}
}
}
Die folgende Klasse ist die Box-Klasse, die das Zeichnen erledigt
Code:
public class Box extends Shapes{
/** xp the x coordinates of the Box corners */
protected int xp[] = new int[5];
/** yp the y coordinates of the Box corners */
protected int yp[] = new int[5];
boolean filled = false;
/** Initializes the Box parameters.
* The arguments provide the starting point of the box
* which may be the upper left hand corner(ULHC) or bottom righthand
* corner coordinates(BRHC) of the Box.
* @param x the x coordinate of the starting position.
* @param y the y coordinate of the starting poistion.
**/
public void init(int x , int y){
st.x = x; st.y = y;
cur.x =x; cur.y =y;
setPolygonVertices();
}
/** Sets the current position.
* @param x the x coordinate of the current position.
* @param y the y coordinate of the current poistion.
**/
public synchronized void setCurrentPosition(Point cp){
cur = cp;
}
/** Draws interactively on a Graphics context g.
* This API does not check whether the Box overflows
* the borders of the component.
* This method uses the XOR paint mode. It erases the
* previously drawn shape and draws a new shape in its
* place.
* @param g the graphics object on which the shape is to be drawn.
**/
public void drawInteractive(Graphics2D g ){
basicStroke = g.getStroke();
g.setColor(Color.black);
g.setXORMode(drawingColor);
//g.setPaintMode();
drawPolygon(g, xp,yp);
setPolygonVertices();
drawPolygon(g, xp,yp);
}
public void draw(Graphics2D g){
Stroke savedStroke = g.getStroke();
if(basicStroke != null) g.setStroke(basicStroke);
g.setColor(Color.black);
g.setXORMode(drawingColor);
setPolygonVertices();
drawPolygon(g, xp,yp);
if(fillOn) {
g.setXORMode(fillColor);
fillPolygon(g, xp,yp);
}
g.setStroke(savedStroke);
}
/** Sets the box points. There are five points. This is because,
* in order to make a closed polygon of n vertices, n+1 points are
* needed. The last one is same as the first one.
**/
private final void setPolygonVertices(){
xp[0] = st.x; yp[0] = st.y;
xp[1] = st.x; yp[1] = cur.y;
xp[2] = cur.x; yp[2] = cur.y;
xp[3] = cur.x; yp[3] = st.y;
xp[4] = st.x; yp[4] = st.y;
}
public boolean contains(Graphics2D g, int x, int y) {
if(!path.contains((double)x, (double)y)) return false;
drawSmallRects(g);
return true;
}
public void drawSmallRects(Graphics2D g) {
smallRectsOn = !smallRectsOn;
g.setColor(Color.black);
g.setXORMode(drawingColor);
for (int i=0; i< xp.length-1;i++) {
int x, y;
if(xp[i] > xp[(i+2)%4]) x = xp[i]+1;
else x = xp[i]-6;
if(yp[i] > yp[(i+2)%4]) y = yp[i]+1;
else y = yp[i]-6;
g.drawRect(x, y, 5,5);
}
}
/** Draws the box with the specified vertices.
* @param g the graphics object on which the shape is to be drawn.
* @param x an array of x coordinates.
* @param y an array of y coordinates.
**/
public void drawPolygon(Graphics2D g, int x[], int y[]){
if((x == null) || (y==null))return;
int num = x.length;
path = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
path.moveTo((float)x[0], (float)y[0]);
for(int i=1; i<num;i++) {
path.lineTo((float)x[i], (float)y[i]);
}
g.draw(path);
}
/** Fills the box.
* @param g the graphics object on which the shape is to be drawn.
* @param x an array of x coordinates.
* @param y an array of y coordinates.
**/
public void fillPolygon(Graphics2D g, int x[], int y[]){
if((x == null) || (y==null))return;
int num = x.length;
path = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
path.moveTo((float)x[0], (float)y[0]);
for(int i=1; i<num;i++) {
path.lineTo((float)x[i], (float)y[i]);
}
g.fill(path);
}
}
Dieses Inteface habe ich übersichtshalber mitgeführt
Code:
// Specifies methods for drawing shapes interactively on a canvas.
public interface Drawable{
public static final int NONE=0;
public static final int BOX=1;
public static final int ELLIPSE=2;
public static final int LINE =3;
public static final int ARROW= 4;
public static final int DOUBLE_HEADED_ARROW= 5;
public static final int ANNOTEXT=6;
public static final int CURVE = 7;
public static final int CUBIC_CURVE = 8;
public static final int POLYGON = 9;
/** Initializes the shape. The inputs specify the anchor position of the shape,
* @param x the y coordinate of the starting position of the shape.
* @param y the y coordinate of the starting position of the shape.
*/
public abstract void init(int x, int y);
/** Sets the current position.
* @param cp the current position of shape
*/
public abstract void setCurrentPosition(Point cp);
/** Draws the shape interactively, which means the shape can be erased when
* the mouse moves to next poistion.
* @param g the graphcs context on which the shape is drawn.
*/
public abstract void drawInteractive(Graphics2D g);
/** Draws the shape permanently, which happens when the mouse is released.
* @param g the graphcs context on which the shape is drawn.
*/
public abstract void draw(Graphics2D g);
/** Moves the shape by a specified displacement.
* @param x the displacement.
* @param y the displacement.
**/
public abstract void move(Graphics2D g, int dispX, int dispY);
/** Erase the shape.
* @param g the graphcs context on which the shape was drawn.
**/
public abstract void erase(Graphics2D g);
}
Das Problem liegt wirklich nur beim Zeichnen, da jeder Schritt des Malprozesses gezeichnet wird.
Ich weiß, dass es viel Code ist und wohl unübersichtlich. Dennoch hoffe ich, dass ihr durch mein Problem durchschaut und mir helfen könnt. TAUSEND DANK