Warum übermalt paint das ganze Fenster?

einfachich

Mitglied
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?

Java:
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.
 
Zuletzt bearbeitet:
Danke, von paintComponent habe ich schon gelesen. Aber ich verstehe das nicht. Woher weiß die Methode paintComponent(), dass ich das JPanel meine? vg
 
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
Java:
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?

Java:
class Qwer extends JPanel{
	public void paint(Graphics g){
		g.setColor(Color.red);
		g.drawLine(100, 0, 500, 500);
	}
}
 
Zuletzt bearbeitet:
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.
 
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:
Java:
Qwer(){setBackground(Color.black);

oder nach Instanziierung in Asdf
Java:
Qwer a = new Qwer();
a.setBackground(Color.black);

Der Hintergrund des Panels bleibt leider grau.
 
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
 
Da gibts nichts zu checken, hier steht bereits die Lösung:

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

Java:
public void paintComponent( Graphics g ){
  super.paintComponent( g );

  g.setColor( Color.RED );
  g.drawLine( ... );
}
 
where is the prob...:

Java:
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);
	}
}
 
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!
 
Zuletzt bearbeitet:
na klar geht das auch...du kannst auch in deinem "Hauptprogramm" eine paint-Methode überschreiben...aber wie der Name schon sagt, überschreibst du.

Java:
	@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.
 

Zurück
Oben