# Warum übermalt paint das ganze Fenster?



## einfachich (26. Jun 2011)

Hallo,

ich habe ein JFrame, in das per GridLayout(3,1) drei übereinanderliegende Bereiche geschaffen werden.
In den mittleren Bereich kommt ein JPanel, auf das per paint-Methode zB eine Linie gezeichnet werden soll.

Frage:
Ich möchte in der Mitte einen schwarzen Hintergrund. Die Zeichnung soll nicht über das ganze JFrame gehen (wie im Beispiel unten), sondern nur über dem schwarzen Hintergrund geschehen.

Weiß jemand Rat?


```
public class Asdf extends JFrame{
  public static void main(String[] args) {
	Asdf a = new Asdf();
	a.setSize(500,500);
	a.setVisible(true);
		
	Container c = a.getContentPane();
	c.setLayout(new GridLayout(3,1));
	c.add(new JButton("1")); //im oberern Bereich ein Button 
		
	JPanel p = new JPanel(); //in der Mitte soll gezeichnet werden
	c.add(p);
		
	c.add(new JButton("3")); //im unteren Bereich ein Button
  }
  public void paint(Graphics g){  //zeichnet leider über das ganze JFrame
	g.setColor(Color.red);
	g.drawLine(0, 0, 500, 500);
  }
}
```

PS: Natürlich könnte ich irgendwas mit clipping machen, aber da muss ich feste Koordinaten eingeben. Die Ändern sich aber, wenn ich das JFrame mit der Maus größer ziehe. Am liebsten wäre es mir, wenn sich der Ursprung für die Zeichnung nicht linksoben am JFrame, sondern linksoben am JPanel orientiert.


----------



## Atze (26. Jun 2011)

ich bin da nicht so ganz der pro, aber ich glaube in swing überschreibt man paintComponent anstelle von paint


----------



## einfachich (26. Jun 2011)

Danke, von paintComponent habe ich schon gelesen. Aber ich verstehe das nicht. Woher weiß die Methode paintComponent(), dass ich das JPanel meine? vg


----------



## Marcinek (26. Jun 2011)

du übeschreibst paint() von jframe.

Eigene Zeichenfläche


----------



## einfachich (26. Jun 2011)

Das verstehe ich nicht. Wenn ich paint() von JFrame überschreibe, wird das ganze JFrame übermalt.

Ich habe jetzt eine Unterklasse von JPanel gebastelt und paint() von JFrame in diese Unterklasse verschoben. Funktioniert soweit. Aber jetzt funktioniert 
	
	
	
	





```
setBackground(Color.black);
```
 nicht, egal ob ich die Anweisung von Asdf oder von oben aus starte. Ich kriege einen roten Strich auf grauem Hintergrund. Weiß jemand warum?


```
class Qwer extends JPanel{
	public void paint(Graphics g){
		g.setColor(Color.red);
		g.drawLine(100, 0, 500, 500);
	}
}
```


----------



## Marcinek (26. Jun 2011)

Wo steht das?

Welcher Fehler kommt?


----------



## einfachich (26. Jun 2011)

Da kommt keine Fehlermeldung. Statt ein roter Strich auf schwarzem Hintergrund, erscheint ein roter Strich auf grauem Hintergrund, so als hätte ich die Anweisung "setBackground(Color.black);" nicht gegeben.


----------



## Marcinek (26. Jun 2011)

Debuuge doch, ob die Methode aufgerufen wird.

Ansonsten musst du schreiben, wo sie steht.


----------



## einfachich (26. Jun 2011)

Die Methode wird aufgerufen. Ich kann sie entweder in dern Constructor von Qwer oder nach der Instanzierung von Qwer in Asdf ausführen.

Constructor in Qwer:

```
Qwer(){setBackground(Color.black);
```

oder nach Instanziierung in Asdf

```
Qwer a = new Qwer();
a.setBackground(Color.black);
```

Der Hintergrund des Panels bleibt leider grau.


----------



## Unregistrierter (26. Jun 2011)

Der Hintergrund wird auch nicht durch Magie farbig:
entweder du malst selbst ein schwarzes Rechteck vor deiner Linie
oder du rufst paint() in der oberklasse auf


----------



## Marcinek (26. Jun 2011)

Dann ruf mal repaint() auf.

Dein .setVisible kommt zu früh.


----------



## einfachich (26. Jun 2011)

setVisible(true) ans Ende zu setzen bringt keinen Erfolg. repaint() auch nicht.
Könnte das jemand Mal checken? Ist nicht viel Code.


----------



## Beni (26. Jun 2011)

Da gibts nichts zu checken, hier steht bereits die Lösung:



Unregistrierter hat gesagt.:


> Der Hintergrund wird auch nicht durch Magie farbig:
> entweder du malst selbst ein schwarzes Rechteck vor deiner Linie
> oder du rufst paint() in der oberklasse auf




```
public void paintComponent( Graphics g ){
  super.paintComponent( g );

  g.setColor( Color.RED );
  g.drawLine( ... );
}
```


----------



## jgh (26. Jun 2011)

where is the prob...:


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Asdf extends JFrame {
	public static void main(String[] args) {

		Asdf a = new Asdf();
		a.setLayout(new GridLayout(3, 1));
		a.add(new JButton("1")); // im oberern Bereich ein Button

		MyJPanel p = new MyJPanel();
		// in der Mitte soll gezeichnet werden
		a.add(p);

		a.add(new JButton("3")); // im unteren Bereich ein Button

		a.setSize(600, 600);
		a.setVisible(true);
		a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

class MyJPanel extends JPanel {

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		setBackground(Color.black);
		g.setColor(Color.red);
		g.drawLine(0, 0, 584, 187);
	}
}
```


----------



## einfachich (26. Jun 2011)

Danke.
Es hat an "super.paintComponent(g);" gelegen.

Ich sehe, es geht nur, wenn in der Klasse des Hauptprogramms (also Asdf) selbst keine paint()-Methode vorhanden ist. Sobald man die reinsetzt (auch wenn sie leer bleibt), gibt es wieder keinen schwarzen Hintergrund.

Trotzdem, danke!


----------



## jgh (26. Jun 2011)

na klar geht das auch...du kannst auch in deinem "Hauptprogramm" eine paint-Methode überschreiben...aber wie der Name schon sagt, überschreibst du.


```
@Override
	public void paint(Graphics g) {
		super.paint(g);
	}
```

solltest du aber das [c]super.paint(g)[/c] nicht aufrufen...macht er halt nichts mehr in der paint-Methode...und dann zeichnet er auch nicht sauber seine Komponenten.


----------

