# Grafikprogramm, zeichnen mit Maus



## morritza (18. Jan 2008)

Moin!! 
Hey ich bräuchte mal ein bisschen Hilfe. Hab hier ein Malprogramm, mit dem ich auf nen BufferedImage zeichnen möchte. Das ist mein erstes Problem. Wenn ich gezeichnet habe und das dann speichern möchte, speichert er nur ein schwarzes Bild welches dann auch nur die größe des "Startfensters" hat also: main.setSize(640, 480);


Dann zum zweiten Problem was ich nicht in den Griff bekomme. Habe vor verschiedene Zeichenfunktionen einzubinden wie Linie,Kreis,Rechteck und Punkte(sollen fließend dargestellt werden)


```
Variablen:
	private JDialog dialog;

	private JLabel status;

	private JFrame f = new JFrame("Test");

	private int x, y, x2, y2, breite; // Var für Zeichenoption

	private BufferedImage image;

	private boolean reset = true; // Check ob immer noch gezeichnet wird

	private int werkzeug; // Var für Werkzeug auswahl



	public void paint(Graphics g) {
		// BufferedImage erstellen wird benÃ¶tigt fÃ¼r ImageIO.write
		BufferedImage image = new BufferedImage(bild.getWidth(), bild
				.getHeight(), BufferedImage.TYPE_INT_RGB);

		// Bild fÃ¼r image malen
		Graphics2D big2d = image.createGraphics();
		big2d.drawImage(image, null, 0, 0);

		Graphics2D g2 = (Graphics2D) g;

		if (werkzeug == 1) {
			System.out.println("Breite 4x");

				g2.drawLine(x, y, x2, y2);
		}
		if (werkzeug == 2) {
			// (int x, int y, int width, int height)
			g2.drawOval(x, y, x2 - x, y2 - x);
		}
		if (werkzeug == 3) {
			// (int x, int y, int width, int height)
			g2.drawRect(x, y, x2, y2);
		}
		if (werkzeug == 4) {

			g2.drawLine(x, y, x2, y2);
			

		}
	}

	// Sammeln der Maus Informationen und repaint()
	private class MouseHandler implements MouseInputListener {
		public void mouseClicked(MouseEvent e) {
			status.setText("entered at (" + e.getX() + ", " + e.getY() + ")");
			System.out.println("ich will hier zeichnen:" + e.getX() + " "
					+ e.getY());

		}

		public void mouseEntered(MouseEvent e) {
			status.setText("entered at (" + e.getX() + ", " + e.getY() + ")");

		}

		public void mouseExited(MouseEvent e) {
			status.setText("exited at (" + e.getX() + ", " + e.getY() + ")");

		}

		public void mousePressed(MouseEvent e) {
			status.setText("pressed at (" + e.getX() + ", " + e.getY() + ")");

			if (werkzeug == 1 || werkzeug == 2 || werkzeug == 3) {
				x = e.getX() + 4;
				y = e.getY() + 48;
			}
		}

		public void mouseReleased(MouseEvent e) {
			status.setText("released at (" + e.getX() + ", " + e.getY() + ")");

			if (werkzeug == 1 || werkzeug == 2 || werkzeug == 3) {
				x = e.getX() + 4;
				y = e.getY() + 48;
				repaint();
			}

		}

		public void mouseDragged(MouseEvent e) {
			status.setText("dragged at (" + e.getX() + ", " + e.getY() + ")");
			if (werkzeug == 4) {
				// wenn maus beweg bzw resetet wurde neue Koordinaten
				if (reset) {
					reset = false;
					x = e.getX() + 4;
					y = e.getY() + 48;
					repaint();
				}
				x2 = e.getX() + 4;
				y2 = e.getY() + 47;
				repaint();
			}
		}

		public void mouseMoved(MouseEvent e) {
			status.setText("moved at (" + e.getX() + ", " + e.getY() + ")");

				reset = true;			
		}

	}




//  ZUM Speichern:

			if (e.getSource() == save) {
				// neuer JFileChooser zum Speichern
				JFileChooser fc = new JFileChooser();
				int returnVal = fc.showSaveDialog(Grafikprogramm.this);
				if (returnVal == JFileChooser.APPROVE_OPTION) {
					File file = fc.getSelectedFile();

					// Schreiben mit ImageIO
					try {

						ImageIO.write(image, "jpg", file);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}
			}
```


Ich hoffe das euch der Code im zusammenhang aussagekräftig genug ist 
Würd mich riesig freuen wenn mir einer weiterhelfen kann.


mfg moritz


----------



## morritza (20. Jan 2008)

Kann mir keiner helfen?? Komm nicht weiter.


----------



## Beni (20. Jan 2008)

Wieso genau erstellst du bei jedem Aufruf von "paint" ein neues Bild? Du zeichnest garnie auf das originale "image", nur immer auf diese lokale Variable.


----------



## morritza (21. Jan 2008)

hmm Dafür gibts kein guten Grund! Hast du recht. Das müsste ja wirklich nur einmal geschehen.

Auf big2d zeichnen funktioniert auch nicht so wirklich. Da nimmt er immer falsche Koordinaten,die sau. Gespeichert wird so auch nichts.  :?:


----------



## Evil-Devil (21. Jan 2008)

Ich würde einfach beim Start des Programms ein je nach User Wünschen großes Bild anlegen und dann immer auf dem zeichnen. Dann sollte es auch beim speichern selbiges kein Problem geben. Einfach mit ImageIO speichern/laden und gut ist.


----------



## morritza (21. Jan 2008)

Hmm ich weiss nicht ob ich das richtig verstanden hab..

Meine Paintmethode soll doch auf das erstellte BufferedImage malen.
Das Caste ich dann als big2d und damit kann ich doch drauf malen?!
Somit hätte ich doch schon die vorgegebene Größe zum zeichen auf das komplette Bild festgelegt.



```
// BufferedImage erstellen wird benÃ¶tigt fÃ¼r ImageIO.write
			image = new BufferedImage(bild.getWidth(), bild.getHeight(),
					BufferedImage.TYPE_INT_RGB);

			// Bild fÃ¼r image malen
			Graphics2D big2d = image.createGraphics();

			int result = fileChooser.showOpenDialog(Grafikprogramm.this);
			// Laden des Dateiauswahl dialogs
			if (result == JFileChooser.APPROVE_OPTION) {
				String name = fileChooser.getSelectedFile().getPath();
				bild.setIcon(new ImageIcon(name));
				opennow.setEnabled(false);
				close.setEnabled(true);
				menuBearbeiten.setEnabled(true);
			}
		}
```

Nur übergibt er das ja nicht an die Paint Methode sondern dort mache ich ja nen neues Graphics Objekt.
public void paint(Graphics g):

```
Graphics2D g2 = (Graphics2D) getGraphics(); //<- doppelt aber anders weiss ich nicht wie es geht
```

Wie bekomm ich das denn hin das er aus dem erstelltem FileChooser-Image mir so ne big2d macht damit ich in der Paint drauf zeichnen kann? Problem ist ja die übergabe der richtigen "Zeichen Fläche".


----------



## Evil-Devil (21. Jan 2008)

Wie du es am Ende machst ist dir überlassen. Du könntest auch ein entsprechend großes Canvas erzeugen das in einem JScrollPane gelagert ist und dann beim speichern das Graphics Object des Canvas abrufen und entsprechend speichern.


----------



## morritza (21. Jan 2008)

Okey.. ich habs jetzt einiger maßen 
Problem mit schwarzem Bild beseitig.. gab viel unnützes Zeug im Code..  ich hab versucht auf nen Icon zu malen.. *ouch*


----------

