# AWT: Pixel für Pixel Linien auf Panel zeichnen



## clrg (2. Mrz 2010)

Hallo Leute

Mein Miniprogramm ist als Übung gedacht. Wenns fertig ist, soll es Feuerwerk anzeigen (bzw. Linien, welche als Raketen interpretiert werden können). Das ganze steckt aber im Anfangsstadium fest, und zwar sehe ich nicht, was ich zeichne bzw. die zeichne(Graphics g)-Methode wird zwar aufgerufen, ich seh aber das Ergebnis davon nicht. Hier ist mein Code:


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

public class Fireworks {
	public static JPanel Center_panel=new JPanel();
	private static JFrame f;
	public static void main(String[] args) throws Exception {
        f=new JFrame("Fireworks v1.0");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 200);
        
        f.setLayout(new BorderLayout());
        JPanel East_panel = new JPanel();
        JPanel North_panel = new JPanel();
        JPanel West_panel = new JPanel();
        JPanel South_panel = new JPanel();
        West_panel.setBackground(new Color(200,255,0));
        East_panel.setBackground(new Color(200,255,0));
        South_panel.setBackground(new Color(200,255,0));
        North_panel.setBackground(new Color(200,255,0));
        Center_panel.setBackground(Color.black);
        f.add("East",East_panel);
        f.add("South",South_panel);
        f.add("North",North_panel);
        f.add("West",West_panel);
        f.add("Center",Center_panel);
        f.setVisible(true);
     
        zeichne(Center_panel.getGraphics());
	}

public static void zeichne(Graphics g) {
 		System.out.println("Methode zeichne aufgerufen");
		int i, x;
		x = 100;
		 for(i=0; i < x; i++){
			 g.setColor(Color.black);
			 g.fillRect(i, 50, 1, 1);
		 }
		 for(i=0; i < x; i++){
			 g.setColor(Color.blue);
			 g.fillRect(i, 100, 1, 1);
		 }
		 Center_panel.repaint();
		 g.dispose();
	}
	
}
```

Sieht jemand meinen Fehler?

Vielen Dank!
Grüsse
clrg


----------



## Michael... (2. Mrz 2010)

Obwohl der Thread mit AWT gekennzeichnet ist, verwendest Du Swing.

Allgemein zeichnet man, in dem man von einer Komponente (JComponent, JPanel...) erbt und deren paintComponent(Graphics g) überschreibt. An Komponenten sollte niemals getGraphics() aufgerufen werden, da nicht sichergestellt ist, ob man einen bzw. den richtigen Graphikkontext zurückbekommt.


----------



## eRaaaa (2. Mrz 2010)

Probiers mal so:

```
public class Fireworks {
    private JFrame f;

    public static void main(String[] args) throws Exception {
	SwingUtilities.invokeLater(new Runnable() {
	    public void run() {
		new Fireworks();
	    }
	});
    }

    public Fireworks() {
	f = new JFrame("Fireworks v1.0");
	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	f.setSize(300, 200);
	f.setLayout(new BorderLayout());
	JPanel East_panel = new JPanel();
	JPanel North_panel = new JPanel();
	JPanel West_panel = new JPanel();
	JPanel South_panel = new JPanel();
	West_panel.setBackground(new Color(200, 255, 0));
	East_panel.setBackground(new Color(200, 255, 0));
	South_panel.setBackground(new Color(200, 255, 0));
	North_panel.setBackground(new Color(200, 255, 0));
	JPanel panel = new FireworksPanel();
	panel.setBackground(Color.black);
	f.add("East", East_panel);
	f.add("South", South_panel);
	f.add("North", North_panel);
	f.add("West", West_panel);
	f.add("Center", panel);
	f.setVisible(true);
    }
}

class FireworksPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
	System.out.println("Methode zeichne aufgerufen");
	int i, x;
	x = 100;
	for (i = 0; i < x; i++) {
	    g.setColor(Color.black);
	    g.fillRect(i, 50, 1, 1);
	}
	for (i = 0; i < x; i++) {
	    g.setColor(Color.blue);
	    g.fillRect(i, 100, 1, 1);
	}
	g.dispose();
    }
}
```

Am Besten man erweitert JPanel und überschreibt paintComponent...
Du solltest dir das "alles in die main reinklatschen" gleich abgewöhnen..für so kleine Demos ist das vllt okay, aber ansonsten sollte die main nicht wirklich viel Arbeit erledigen...


----------

