Zeichnen in AWT Panels

Videnex

Grünschnabel
Guten Abend :)

Ich sitz hier an einem Java Projekt für die Schule, und unser Lehrer sagt, wir müssen AWT verwenden, SWING ist leider nicht erlaubt. :( Nun rätsel ich scho an nem Problem, wo ich einfach nicht weiterkomme, und zwar, wie ich in ein Panel zeichne?

Hier mein Versuch (Hab auch schon etliche andere durch):

Code:
import java.awt.*;

public class DrawImage extends Canvas
{
  private Image img = new Image;

  DrawImage()
  {
    img = getToolkit().getImage( ".\\lala.jpg" );
  }

  public void paintComponents( Graphics g )
  {
    g.drawImage( img , 5, 5, this );
  }
}

Und
Code:
import java.awt.*;

public class Fenster extends Frame
{
  private Panel pnl = new Panel(null);
  
  Fenster()
  {
    super();
    int frameX = 600;
    int frameY = 350;

    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - frameX) / 2;
    int y = (d.height - frameY) / 2 ;

    this.setTitle("title");
    this.setSize(frameX, frameY);
    this.setLocation(x,y);
    this.setResizable(false);

    this.pnl.add( new DrawImage() );
    this.add(pnl);
    this.setVisible(true);
  }

  public static void main(String[] args)
  {
    Fenster f = new Fenster();
  }
}

Und ich kriege es einfach nicht, hin, dass das Bild in das Panel gezeichnet wird
(Quellcode stark gekürzt).

M.f.G.
 
Ein paar Dinge die bei dir fehlen:

Einmal solltes du dafür sorgen dass sich das Programm auch beendet wenn du auf den schliessen Button des Fensters klickst. Das macht man in awt mit:
Java:
this.addWindowListener(new WindowAdapter( ) {

			public void windowClosing(WindowEvent arg0) {
				dispose( );
			}
		});

Weiterhin musst du deinen Panels immer ein Layout geben. Ein Layout sorgt dafür dass Komponenten die nicht explizit eine Größe zugewiesen bekommen haben anhand des Layouts trotzdem einen Platz bekommen und dargestellt werden. In deinem Code wurden weder das Panel noch das Canvas dargestellt, da weder eine größe noch ein Layout vorhanden war.

Ein Layout kannst du so zuweisen:
Java:
this.setLayout(new GridLayout(1, 1));

Kleiner Tipp: Um zu testen ob eine Komponente überhaupt dargestellt wird, kannst du dieser eine andere Hintergrundfarbe geben. Die sieht man auch wenn sonst nichts am Code passt ;) So habe ich rausgefunden dass das DrawImage Canvas gar nicht dargestellt wurde.

Im DrawImage Canvas hast du dann eine Swing Methode überschrieben. paintComponents gibt es bei awt nicht, du hättest paint überschreiben müssen. Dann funktioniert es auch mit der Darstellung des Bildes.

Der gesamte Code nun:
Java:
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Fenster extends Frame {

	private Panel pnl = new Panel(null);

	Fenster() {
		super( );
		int frameX = 600;
		int frameY = 350;

		Dimension d = Toolkit.getDefaultToolkit( ).getScreenSize( );
		int x = (d.width - frameX) / 2;
		int y = (d.height - frameY) / 2;

		this.setTitle("title");
		this.setSize(frameX, frameY);
		this.setLocation(x, y);
		this.setResizable(false);

		this.addWindowListener(new WindowAdapter( ) {

			public void windowClosing(WindowEvent arg0) {
				dispose( );
			}
		});

		this.setLayout(new GridLayout(1, 1));
		this.pnl.setLayout(new GridLayout(1, 1));
		this.pnl.add(new DrawImage( ));
		this.add(pnl);
		this.setVisible(true);
	}

	public static void main(String[] args) {
		Fenster f = new Fenster( );
	}
}

Java:
import java.awt.*;

public class DrawImage extends Canvas {

	private Image img;

	DrawImage() {
		img = getToolkit( ).getImage("diablo.jpg");
	}

	public void paint(Graphics g) {
		g.drawImage(img, 5, 5, this);
	}
}
 
Hatte ja gesagt, dass ich stark gekützt hatte, Window/ActionListener hab ich eig. immer in ner externen Klasse, aber naja, andere Sache, mein Problem ist weiterhin, dass ich das soweit auch schon hatte, aber keine Layouts benutzen wollte, sondern das ich die Position mit Bounds bestimmen wollte, was bei mir nie funktioniert...

Code:
    Panel cp = new Panel(null);
    add(cp);
    this.pnl.setBounds(50,50, 200, 200);
    this.pnl.add(new DrawImage());
    cp.add(pnl);

da wiederum wird es nich angezeigt
 
Hat denn das DrawImage dann ne größe? Weil wenn das Panel kein Layout hat muss das DrawImage Canvas eine größe haben, sonst wird es nicht angezeigt.
 
Zurück