Problem beim Linien ziehen!

  • Themenstarter Themenstarter Paristick
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
P

Paristick

Gast
Hallo!

Ich habe eine Frage zu einem Problem, dass mich schon zu lange nervt, obwohl nix Großartiges dahinter sein kann. Und zwar gehts dabei um das Ziehen einer geraden Linie. Mein Problem besteht darin, dass ich immer einen Fächereffekt beim Zeichnen bekomme und erst beim resizen des Fensters wird wirklich nur die letze Linie dargestellt. Ich habe das Ganze mit 2 Listen gelöst - aber seht am Besten selbst:

//Die ganzen Imports lass ich mal weg...


<code>
public class ePanel extends JPanel implements MouseListener,
MouseMotionListener {

private static final long serialVersionUID = 1L;

int x1;
int x2;
int y1;
int y2;
boolean dragged = false;
boolean released = true;

// @jve:decl-index=0:

public List<Shape> drawlist = new ArrayList<Shape>(); // @jve:decl-index=0:
public List<Shape> dragglist = new ArrayList<Shape>(); // @jve:decl-index=0:


// @jve:decl-index=0:

/**
* This is the default constructor
*/

public ePanel() {
super();
initialize();
}

public void paint (Graphics g) {

g.setColor(Color.black);

for (int i = 0; i <= this.getWidth(); i = i + 20) {
g.drawLine(i, 0, i, this.getHeight());
}
for (int i = 0; i <= this.getHeight(); i = i + 20) {
g.drawLine(0, i, this.getWidth(), i);
}

if (released == true) {
if (Main.shapeUebergabe == "line") {
if (Main.colorUebergabe == "blue") {
Stroke stroke = new Stroke(x1, y1, x2, y2, Color.BLUE);
drawlist.add(stroke);
} else if (Main.colorUebergabe == "red") {
Stroke stroke = new Stroke(x1, y1, x2, y2, Color.RED);
drawlist.add(stroke);
}
} else if (Main.shapeUebergabe == "ellipse") {
if (Main.colorUebergabe == "blue") {
Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.BLUE);
drawlist.add(ellipse);
} else if (Main.colorUebergabe == "red") {
Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.RED);
drawlist.add(ellipse);
}
}
}

if (dragged == true) {
if (Main.shapeUebergabe == "line") {
if (Main.colorUebergabe == "blue") {
dragglist.clear();
Stroke stroke = new Stroke(x1, y1, x2, y2, Color.BLUE);
dragglist.add(stroke);
}
}
}

for (Shape s : dragglist) {
s.paint(g);
}

for (Shape s : drawlist) {
s.paint(g);
}

}

private void initialize() {

this.setSize(300, 200);
this.addMouseListener(this);
this.addMouseMotionListener(this);
}

// @jve:decl-index=0:
@Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent press) {

x1 = press.getX();
y1 = press.getY();

}

// @jve:decl-index=0:

@Override
public void mouseReleased(MouseEvent release) {
released = true;
dragged = false;
x2 = release.getX();
y2 = release.getY();
repaint();
}

@Override
public void mouseDragged(MouseEvent drag) {
dragged = true;
released = false;
x2 = drag.getX();
y2 = drag.getY();
repaint();

}

@Override
public void mouseMoved(MouseEvent arg0) {

}


}

</code>
 
In paint darfst du niemals dein Datenmodell (die Listen) manipulieren. Das muss in Folge der MouseEvents geschehen.
 
Etwas verstehe ich nicht:
"java.awt.Stroke" ist ein interface mit der Methode "Shape createStrokedShape (Shape p);"
aber eine Klasse Stroke kenne ich nicht, nur "public class BasicStroke implements Stroke"
im package java.awt.
 
Danke erstmal für die schnellen Antworten!

habe für die Shapes eigene Klassen erstellt in der sie sich selbst zeichnen... deshalb gibts eine Klasse Stroke!
 
Ok, jetz hab ich die Veränderung der Listen aus der paint Methode rausgenommen und eigene Funktionen geschrieben, die bei mousedragged() und mousereleased() aufgerufen werden... hab den gleichen Fächereffekt noch immer, erst wenn ich das Fenster resize oder ein neues ePanel zum zeichenn aufmache, dann bleibt wirklich nur der letzte Strich auf dem Panel sichtbar, bis dahin sind alle sichtbar - eben dieser Fächer... der neue code schaut so aus:

Code:
import javax.sound.sampled.Line;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextArea;

public class ePanel extends JPanel implements MouseListener,
		MouseMotionListener {

	private static final long serialVersionUID = 1L;

	int x1;
	int x2;
	int y1;
	int y2;

	// @jve:decl-index=0:

	public List<Shape> drawlist = new ArrayList<Shape>();  //  @jve:decl-index=0:
	public List<Shape> dragglist = new ArrayList<Shape>();  //  @jve:decl-index=0:


	// @jve:decl-index=0:

	/**
	 * This is the default constructor
	 */

	public ePanel() {
		super();
		initialize();
	}

	public void paint (Graphics g) {

		g.setColor(Color.black);

		for (int i = 0; i <= this.getWidth(); i = i + 20) {
			g.drawLine(i, 0, i, this.getHeight());
		}
		for (int i = 0; i <= this.getHeight(); i = i + 20) {
			g.drawLine(0, i, this.getWidth(), i);
		}



		for (Shape s : drawlist) {
			s.paint(g);
		}
		
		for (Shape s : dragglist) {
			s.paint(g);
		}
		

		
		
		
	}

	private void initialize() {

		this.setSize(300, 200);
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
	}

	// @jve:decl-index=0:
	@Override
	public void mouseClicked(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent press) {

		x1 = press.getX();
		y1 = press.getY();

	}

	// @jve:decl-index=0:

	@Override
	public void mouseReleased(MouseEvent release) {

		x2 = release.getX();
		y2 = release.getY();
		released();
		repaint();
	}

	@Override
	public void mouseDragged(MouseEvent drag) {

		x2 = drag.getX();
		y2 = drag.getY();
		dragged();
		repaint();
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {

	}
	
	public void dragged() {
		
		if (Main.shapeUebergabe == "line") {
			if (Main.colorUebergabe == "blue") {
				Stroke stroke = new Stroke(x1, y1, x2, y2, Color.BLUE);
				dragglist.add(stroke);
			} else if (Main.colorUebergabe == "red") {
				Stroke stroke = new Stroke(x1, y1, x2, y2, Color.RED);
				dragglist.add(stroke);
			}
		} else if (Main.shapeUebergabe == "ellipse") {
			if (Main.colorUebergabe == "blue") {
				Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.BLUE);
				dragglist.add(ellipse);
			} else if (Main.colorUebergabe == "red") {
				Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.RED);
				dragglist.add(ellipse);
			}
		}
	}
	
	public void released() {
		if (Main.shapeUebergabe == "line") {
			if (Main.colorUebergabe == "blue") {
				Stroke stroke = new Stroke(x1, y1, x2, y2, Color.BLUE);
				drawlist.add(stroke);
			} else if (Main.colorUebergabe == "red") {
				Stroke stroke = new Stroke(x1, y1, x2, y2, Color.RED);
				drawlist.add(stroke);
			}
		} else if (Main.shapeUebergabe == "ellipse") {
			if (Main.colorUebergabe == "blue") {
				Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.BLUE);
				drawlist.add(ellipse);
			} else if (Main.colorUebergabe == "red") {
				Ellipse ellipse = new Ellipse(x1, y1, x2, y2, Color.RED);
				drawlist.add(ellipse);
			}
		}
	}

	
}
 
Aja, was jetz noch in dem Codeteil da oben fehlt, is das "dragglist.clear()" in der ersten Zeile der dragged() Methode, damit auch beim resizen wenigstens das richtige angezeigt wird...
 
Hmm... das mit "==" funktioniert eigentlich ganz gut! Mein Problem ist eigentlich ein ganz anderes. Vielleicht jemand eine Idee dazu!?

Grüße Paristick
 
In einem JPanel nicht paint überschreiben, sondern paintComponent
Code:
public void paintComponent(Graphics g)
{
    super.paintComponent(g); // <--- auch wischtisch!

    //... hier jetzt dein Kram...

}
 
im JPanel überschreibt man mit:


public void paintComponent(Graphics g) {
super.paintComponent(g); // wichtig, Panel leeren

// dein Code

}


edit:
mist, schneller und schöner 😉
 
WAHNSINN!!! ENDLICH *gg* freu mich jetz grad total... alles funktioniert 😀 😀

Vielen Dank 🙂
 
Paristick hat gesagt.:
Hmm... das mit "==" funktioniert eigentlich ganz gut! Mein Problem ist eigentlich ein ganz anderes.
Es funktioniert nur unter sehr bestimmten Vorraussetzungen. Verwende equals.
Beispiel das nicht mehr funktioniert:
Code:
Main.shapeUebergabe == new String("ellipse")
 
Beim Stringvergleich wird davor gewarnt == oder != zu benutzen.
Z.B. bei verschiedenen Strings mit gleichem Inhalt gibt "equals()" immer "true" zurück,
aber == liefert dann das falsche Resultat.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben