Zeichnen mit java.awt.Graphics

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:
Java:
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 🙁
 
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:
 
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:
Java:
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:
Java:
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
 
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)
 

Zurück
Oben