# Graphics 2D Zeichnen



## Chris82KS (17. Dez 2004)

Hi!

Ich bin gerade daran einen Java 2D Grafik Editor zu programmieren. Habe aber Probleme mit dem Zeichnen. Und zwar habe ich ein leeres Image auf einem Label erzeugt. Also ein ImageIcon. Dann erstelle ich aus dem Label ein Graphics2D Kontext. Und in dem zeichne ich. Ist auch alles wunderbar sichtbar, aber mein Problem ist, dass wennn ich das Frame vergrößere, wo das Label drin ist, alles gezeichnete wieder weg ist. Wie kann ich das beibehalten? Hier mal der Quelltext:


```
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

import javax.swing.JLabel;

public class DrawEngine {

	private TestUmgebung myTest;

	public DrawEngine(TestUmgebung test) {
		myTest = test;
	}

	public void drawingPixels(JLabel label, int x, int y) {

		double valueX = (double) x;
		double valueY = (double) y;

		Graphics2D g = (Graphics2D) label.getGraphics();
		g.setPaint(Color.BLUE);
		g.draw(new Line2D.Double(valueX, valueY, valueX, valueY));
	}
}
```

Hier die MouseMotion Funktion die die drawingPixels aufruft:


```
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JLabel;

public class Mousy implements MouseMotionListener {

	private JLabel content;
	private DrawEngine myEngine;

	public Mousy(JLabel label, DrawEngine engine1) {
		content = label;
		myEngine = engine1;
	}

	public void mouseDragged(MouseEvent me) {
		int x = me.getX();
		int y = me.getY();
		myEngine.drawingPixels(content, x, y);
		
	}

	public void mouseMoved(MouseEvent arg0) {
	}

}
```

Und hier noch die Hauptklasse:

```
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class TestUmgebung extends JFrame {

	private BufferedImage theImage;

	private DrawEngine engine;

	private JLabel screen;

	public TestUmgebung() {

		engine = new DrawEngine(this);

		theImage = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = theImage.createGraphics();
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, 400, 400);

		ImageIcon icon = new ImageIcon(theImage);

		screen = new JLabel(icon, JLabel.CENTER);
		screen.addMouseMotionListener(new Mousy(screen, engine));

		getContentPane().add(screen);
		setSize(400, 400);
		setVisible(true);
	}

	public static void main(String[] args) {
		TestUmgebung tu = new TestUmgebung();
	}
}
```

Wäre für Hilfe echt dankbar.

Gruß
Chris


----------



## Illuvatar (17. Dez 2004)

Lies mal hier, die Änderungen sind nämlich nicht dauerhaft auf diese Weise.


----------



## Chris82KS (30. Dez 2004)

Danke, aber irgendwie kriege ich es nicht geacken. Gibt es irgendwo nen exaktes Beispiel, wo mal einer so was auf nem JLabel oder so gezeichnet hat, oder kann mir konkret bei meinem Problem helfen?
Meinen Source-Code gibt es unter www.uni-kassel.de/~chmielke

Gruß
Chris


----------



## Illuvatar (2. Jan 2005)

Oder schau mal in dem Tutorial von Roar und Beni:
http://www.java-forum.org/de/viewtopic.php?t=11941


----------



## Chris82KS (10. Jan 2005)

Nicht schlecht das Tutorial. Leider hat es mir noch nicht ganz zu dem gewünschten Erfolg verholfen.
Der Code sieht jetzt folgendermaßen aus. Ich habe eine Klasse von JComponent abgeleitet und will in der überschriebenen Methode paintComponent zeichnen, doch das klappt immer noch nicht. Was ist jetzt falsch? Hier mal der Code jetzt:


```
package testumgebung;

import javax.swing.JFrame;

public class TestUmgebung extends JFrame {

	
	private MyLabel screen;
	private Mousy mouse1;	
	
	public TestUmgebung() {
		
		setSize(400, 400);
		screen = new MyLabel(this);
		mouse1= new Mousy(screen, this);
		screen.addMouseMotionListener(mouse1);
				
		getContentPane().add(screen);
		setVisible(true);
	}

	public static void main(String[] args) {
		TestUmgebung tu = new TestUmgebung();
	}
}
```


```
package testumgebung;

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

public class Mousy implements MouseMotionListener{

	private MyLabel content;
	private Point firstPoint;
	private Point lastPoint;
	
	private TestUmgebung parent;
	
	
	public Mousy(MyLabel label, TestUmgebung umgebung) {
		parent = umgebung;
		content = label;
		firstPoint = new Point();
		lastPoint = new Point();
		
	}

	public void mouseDragged(MouseEvent me) {
		
		firstPoint = me.getPoint();
		
		if (lastPoint.x == 0) {
			lastPoint.x=firstPoint.x;
			lastPoint.y=firstPoint.y;
			content.setP1(firstPoint);
			content.setP2(lastPoint);			
			lastPoint.x = firstPoint.x;
			lastPoint.y = firstPoint.y;
				
			
		}else {
			content.setP1(firstPoint);
			content.setP2(lastPoint);
			lastPoint.x = firstPoint.x;
			lastPoint.y = firstPoint.y;			
		}
	}
	
	public Point getP1() {
		return firstPoint;
	}
	
	public Point getP2() {
		return lastPoint;
	}

	public void mouseMoved(MouseEvent me) {
	}

}
```


```
package testumgebung;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.Icon;
import javax.swing.JComponent;


public class MyLabel extends JComponent {
	
	private Icon image;
	private TestUmgebung parent;	
	
	private Point p1;
	private Point p2;
			
	public MyLabel (TestUmgebung test) {
		p1 = new Point();
		p2 = new Point();
		parent = test;
		setDoubleBuffered(true);
		setOpaque(true);		
	}
	
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		//g.setColor(Color.WHITE);
		//g.fillRect(0, 0, parent.getWidth(), parent.getHeight());
		
		//if (p1.x != 0){
			g.setColor(Color.BLUE);
			g.drawLine(this.p1.x, this.p1.y, this.p2.x, this.p2.y);
		//}
	}
	
	public void setP1(Point p) {
		this.p1 = p;
	}
	
	public void setP2(Point p) {
		this.p2 = p;
	}
	
}
```

Vielleicht kann mir ja nochmal jemand helfen und mir sagen warum es nicht geht, oder wie ich es besser mache. Viele sage ich nochmal kurz was ich hier überhaupt vorhabe: Ich will praktisch die "Stift-Funktion" eines Zeichenprgramms implementiereren. Also wenn ich mit gedrückter Maustaste über das Ding fahre, dass dann gezeichnet wird.

Gruß
Chris


----------

