# Zeichnen mit java.awt.Graphics



## -Subscription- (20. Jun 2011)

Ich habe eine Hausaufgabe in der ich ein Dreieck zeichnen soll.
Das Dreieck selbst ist eigentlich kein Problem, aber irgendwie bekomme ich es nicht mehr hin das überhaupt irgendetwas gezeichnet wird.

Vielleicht könntet ihr mal über meinen Code schauen und mir sagen wo der Fehler ist:

```
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

/**
 * Draw a triangle.
 * 
 * @author -Subscription-
 */
public class Triangle {

	/** Global variables */
	private JFrame frame = new JFrame();
	
	/**
	 * Constructor.
	 */
	public Triangle() {
		setGui();
		Graphics g = frame.getGraphics();
		paint(g);
	}

	/**
	 * This method is doing the graphic stuff.
	 */
	public void paint(Graphics g){
		// Just to test if the painting works
		System.out.println("Debug: Test if the paint method works.");
		g.setColor(Color.red);
		g.drawLine(0, 0, 500, 500);
    }
	
	/**
	 * Creates the graphic user interface.
	 */
	private void setGui() {
		frame.setTitle("Sierpinski Triangle");
		frame.setBounds(450, 100, 500, 500);
		frame.setBackground(Color.WHITE);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Triangle tri = new Triangle();
	}

}
```

Mir fiel auf die Linie wird nur im 1. Frame gezeichnet und verschwindet dann sofort


----------



## Gast2 (21. Jun 2011)

```
Graphics g = frame.getGraphics();
        paint(g);
```
böse böse böse!!!!!!!

Du hast da ne menge durcheinander, ließ dir vllt zunächst mal folgendes durch:
http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html


----------



## Marco13 (21. Jun 2011)

Kann man das Zensur-Modul, das z.B. "Schei..e" zu Sternchen ****** macht, nicht so um-trainieren, dass es beim Auftreten von "getGraphics" in einem Post automatisch eine Antwort postet, in der auf das Tutorial verlinkt wird...? :reflect:


----------



## -Subscription- (22. Jun 2011)

Das Problem war ich hatte einen JFrame (swing) mit Graphics (awt) vermischt. Aus dem JFrame habe ich nun einfach ein Frame gemacht, wodurch das ganze nun funktioniert.

Mein funktionierender Code sieht nun so aus:

```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * Draw a triangle.
 * 
 * @author -Subscription-
 */
public class Triangle extends Frame {
	
	/** Constructor. */
	public Triangle() {
		setGui();
	}

	/**
	 * This method is doing the graphic stuff.
	 */
	public void paint(Graphics g){
		// Just to test if the painting works
		System.out.println("Debug: Test if the paint method works.");
		g.setColor(Color.red);
		g.drawLine(0, 0, 500, 500);
    }
	

	/**
	 * Creates the graphic user interface.
	 */
	private void setGui() {
		setTitle("Sierpinski Triangle");
		setBounds(450, 100, 500, 500);
		setBackground(Color.WHITE);
		setLayout(new BorderLayout());
		addWindowListener( new WindowAdapter() {
		      @Override
		      public void windowClosing ( WindowEvent e ) { System.exit( 0 ); }
		    } );
		setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Triangle();
	}

}
```

Eine weitere Methode die ich im Internet gefunden habe, bei der man JFrame benutzen kann und ohne *extends* arbeitet, funktioniert so:

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

class GetGraphics
{
  public static void main(String[] args)
  {
  JFrame frame=new JFrame();
  frame.setLayout(new FlowLayout());
  BufferedImage image=new BufferedImage(400,400,BufferedImage.TYPE_INT_ARGB);
  Graphics graphics=image.getGraphics();
  
  graphics.setColor(Color.red);
  graphics.drawOval(150,50,120,50);
  graphics.dispose();
  JLabel label=new JLabel(new ImageIcon(image));
  frame.add(label);
  frame.setTitle("Graphics");
  frame.setSize(200,150);
  frame.setVisible(true);
  }
}
```
Gefunden auf: Java get Graphics


----------



## Gast2 (22. Jun 2011)

Naja, auch in nem JFrame hantierst du mit Graphics (awt) Objekt rum 
Du hast aber auch nen paar mehr sachen korrigiert die im ersten Beispiel falsch waren.

Änderst du in deinem Triangle Beispiel Frame zu JFrame und paint zu paintComponent funktioniert das genauso. (in beiden fällen solltest du aber zwingend noch den super.paint... aufruf einsetzen)


----------



## Marco13 (22. Jun 2011)

Ja, auf einem BufferedImage ist getGraphics OK (besser: createGraphics und am Ende graphics.dispose()).


----------



## -Subscription- (22. Jun 2011)

Oh vielen Dank 
Das mit paintComponent hätte ich tun sollen. Kannte ich aber noch nicht.

Vielen Dank für eure Hilfe Eike und Marco!


----------

