# setBackground bei JFrame und JPanel



## bliko (4. Feb 2008)

Ich habe die folgende Datei geschrieben, das Setzen des Hintergrundes aber funktioniert nicht. 

```
package aufgaben;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame{
	
	public TestFrame(){
		setTitle("Test");
		setSize(400,400);
		setLocationRelativeTo(null);
		setBackground(Color.orange);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
	public static void main(String[] args)
	{
	    TestFrame frame = new TestFrame();
	    Container cont = frame.getContentPane();
	    Test t = new Test();
	    cont.add(t);
	}
}
	
	class Test extends JPanel
	{
	  public Test()
	  { 
	    setBackground(Color.orange);  
	  }
	  public void paintComponent(Graphics g)
	  {
	    paintComponents(g);
		g.drawRect(25,40,50,80);
	    g.setColor(Color.green);
	    g.drawLine(85,87,225,90);
	    g.setColor(Color.blue);
	    g.drawOval(150,200,50,50);
	    g.setColor(Color.orange);
	    g.fillOval(50,230,70,70);
	    g.setColor(Color.red);
	    g.fillArc(200,200,100,100,25,76);
	  }
	}
```

Gibt es dafür allgemeine Regeln, wie das Setzen von Hintergründen im Allg. funktioniert? Wer überschreibt was, bzw. wann wird überhaupt etwas gelesen. Hat das etwas mit der Klassenstruktur zu tun?


----------



## outbreaker (4. Feb 2008)

Es gibt zwei Sachen die du beachten solltest

1.) setzte dein Frame erst auf Visible true wenn du alle Componenten hinzugefügt hast
oder
2.) mache nach dem hinzufügen von Komponenten ein validate()

Beispiel1:


```
public class TestFrame extends JFrame{
	   
	   public TestFrame(){
	      setTitle("Test");
	      setSize(400,400);
	      setLocationRelativeTo(null);
	      setBackground(Color.orange);
	      setDefaultCloseOperation(EXIT_ON_CLOSE);
	   }
	   public static void main(String[] args)
	   {
	       TestFrame frame = new TestFrame();
	       Container cont = frame.getContentPane();
	       Test t = new Test();
	       cont.add(t);
	       frame.setVisible(true);
	   }
	}
	   
	   class Test extends JPanel
	   {
	     public Test()
	     {
	       setBackground(Color.orange);
	     }
	     public void paintComponent(Graphics g)
	     {
	       paintComponents(g);
	      g.drawRect(25,40,50,80);
	       g.setColor(Color.green);
	       g.drawLine(85,87,225,90);
	       g.setColor(Color.blue);
	       g.drawOval(150,200,50,50);
	       g.setColor(Color.orange);
	       g.fillOval(50,230,70,70);
	       g.setColor(Color.red);
	       g.fillArc(200,200,100,100,25,76);
	     }
	   }
```

oder 

Beispiel2:


```
public class TestFrame extends JFrame{
	   
	   public TestFrame(){
	      setTitle("Test");
	      setSize(400,400);
	      setLocationRelativeTo(null);
	      setBackground(Color.orange);
	      setDefaultCloseOperation(EXIT_ON_CLOSE);
	      setVisible(true);
	   }
	   public static void main(String[] args)
	   {
	       TestFrame frame = new TestFrame();
	       Container cont = frame.getContentPane();
	       Test t = new Test();
	       cont.add(t);
	       cont.validate();
	   }
	}
	   
	   class Test extends JPanel
	   {
	     public Test()
	     {
	       setBackground(Color.orange);
	       this.validate();
	     }
	     public void paintComponent(Graphics g)
	     {
	       paintComponents(g);
	      g.drawRect(25,40,50,80);
	       g.setColor(Color.green);
	       g.drawLine(85,87,225,90);
	       g.setColor(Color.blue);
	       g.drawOval(150,200,50,50);
	       g.setColor(Color.orange);
	       g.fillOval(50,230,70,70);
	       g.setColor(Color.red);
	       g.fillArc(200,200,100,100,25,76);
	     }
	   }
```


----------



## bliko (4. Feb 2008)

ich habe nun folgende Version versucht

```
package aufgaben;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame{
    
    public TestFrame(){
       setTitle("Test");
       setSize(400,400);
       setLocationRelativeTo(null);
       setBackground(Color.black);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setVisible(true);
    }
    public static void main(String[] args)
    {
        TestFrame frame = new TestFrame();
        Container cont = frame.getContentPane();
        Test t = new Test();
        cont.add(t);
        cont.validate();
    }
 }
    
    class Test extends JPanel
    {
        private Dimension d = new Dimension(200,200);
    	
    	public Test()
      {
        setBackground(Color.orange);
        setPreferredSize(d);
        this.validate();
      }
      public void paintComponent(Graphics g)
      {
        paintComponents(g);
        g.drawRect(25,40,50,80);
        g.setColor(Color.green);
        g.drawLine(85,87,225,90);
        g.setColor(Color.blue);
        g.drawOval(150,200,50,50);
        g.setColor(Color.orange);
        g.fillOval(50,230,70,70);
        g.setColor(Color.red);
        g.fillArc(200,200,100,100,25,76);
      }
    }
```

es ist aber immer wieder das gleiche Problem, dass der JFrame-Hintergrund alles überschreibt, ich hätte nur als Beispiel gerne einen schwarzen Frame-Hintergrund und einen orangen Panel-Hintergrund. Geht das nicht?


----------



## outbreaker (4. Feb 2008)

wie soll das aussehen?

Dein JPanel ist doch aufgrund des LayoutManagers genau so groß wie dein JFrame


----------



## outbreaker (4. Feb 2008)

sorry habe mich verlesen 
hatte gelesen das JPanel das JFrame überschreibt und nicht umgekert


----------



## outbreaker (4. Feb 2008)

mach mal aus deinem 
	
	
	
	





```
super.paintComponents(g);
```
 ein 
	
	
	
	





```
super.paintComponent(g);
```
also das *s* weg
dann nimmt er auch deinen Hintergrund von JPanel


----------



## L-ectron-X (4. Feb 2008)

Das eigentliche Problem liegt darin, dass der Hintergrund des JFrames gar nicht gefärbt wird.


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

public class DrawFrame extends JFrame {
   public DrawFrame(String title) {
      super(title);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      setLocationRelativeTo(null);
      setLayout(new FlowLayout());
      
      getContentPane().setBackground(Color.BLACK); //Hintergrund des JFrames färben
      
      DrawPanel panel = new DrawPanel(350, 300, Color.ORANGE);
      add(panel);
   }

   public static void main(String[] args) {
      new DrawFrame("DrawFrame").setVisible(true);
   }
}
```


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

public class DrawPanel extends JPanel {

   public DrawPanel(int width, int height, Color background) {
      setPreferredSize(new Dimension(width, height));
      setBackground(background);
   }
   
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawRect(25,40,50,80);
      g.setColor(Color.green);
      g.drawLine(85,87,225,90);
      g.setColor(Color.blue);
      g.drawOval(150,200,50,50);
      g.setColor(Color.orange);
      g.fillOval(50,230,70,70);
      g.setColor(Color.red);
      g.fillArc(200,200,100,100,25,76);
   }
}
```


----------



## outbreaker (4. Feb 2008)

wo ist jetzt der Unterschied zu meinem?


----------



## L-ectron-X (4. Feb 2008)

Mal abgesehen vom Codestil, probiere einfach mal deinen und meinen Vorschlag nacheinander aus, dann wirst du den Unterschied feststellen.


----------



## outbreaker (4. Feb 2008)

der Code-Still ist nicht von mir habe nur die Datein von *bliko* bearbeitet  :wink:


----------



## outbreaker (4. Feb 2008)

der Unterschied der zwischen meinem und deinem ist habe ich ja oben auch schon beschrieben  :wink: 
nämlich das das JPanel genauso groß ist wie das JFrame



			
				outbreaker hat gesagt.:
			
		

> wie soll das aussehen?
> 
> Dein JPanel ist doch aufgrund des LayoutManagers genau so groß wie dein JFrame



 :wink:


----------



## L-ectron-X (4. Feb 2008)

Und, hat dein Frame einen schwarzen Hintergrund?


----------



## outbreaker (4. Feb 2008)

Wenn ich das JPanel nicht hinzufüge und das getContentPane() im Konstruktor nicht vergesse dann ist es auch schwarz ja
Aber wie gesagt würde man ja eh nicht sehen


----------



## bliko (4. Feb 2008)

nein!
ich hab's jetzt anders probiert und vielleicht wird jetzt mein "Problem" klarer: dort wo es im Frame weiß ist, hätte ich gerne eine andere Farbe, das meine ich mit Frame-Hintergrund oder sehe ich das falsch?

TestFrame.java // soll eben den Hintergrund schwarz setzen - tut er aber nicht!

```
//package aufgaben;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame{
    
    public TestFrame(){
    	
       setTitle("Test");
       setSize(650,500);
       setLocationRelativeTo(null);
       setBackground(Color.black);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args)
    {
        FlowLayout fl = new FlowLayout();
        JLabel jl = new JLabel("Grafiken");
        jl.setFont(new Font("SansSerif", Font.BOLD, 32));
    	TestFrame frame = new TestFrame();
        frame.setLayout(fl);
        Container cont = frame.getContentPane();
        TestPanel t = new TestPanel();
        cont.add(jl);
        cont.add(t);
        frame.setVisible(true);
    }
 }
```


```
TestPanel.java // Panel mit Grafik, dort funktioniert jetzt der Hintergrund(orange)

import javax.swing.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

public class TestPanel extends JPanel
{
	private Color[] farben = {Color.white, Color.black, Color.blue,
				  	  Color.red, Color.yellow, Color.cyan, 
					  Color.lightGray, Color.magenta, Color.green, Color.darkGray};
	private Dimension d = new Dimension(600,400);

public TestPanel()
{
	setBackground(Color.orange);
	setPreferredSize(d);
}


	public void paintComponent (Graphics grafik)
	{
		super.paintComponent(grafik);
		grafik.setColor(getBackground());	
		grafik.fillRect (0, 0, getSize().width, getSize().height);
		int x1, x2, y1, y2;
		x1 = 20; x2 = 100; y1 = y2 = 30;

		// Rechteck mit drawLine(...)
		for (int i = 0; i <= 5; i++)
		{
			grafik.setColor (farben[(int) (Math.random()*10)]);
			grafik.drawLine(x1, y1, x2, y2);
			grafik.drawLine(x2, y2, x2, y2+80);
			grafik.drawLine(x2, y2+80, x1, y1+80);
			grafik.drawLine(x1, y1+80, x1, y2);
			x1 += 10;
			x2 += 10;
			y1 += 20;
			y2 += 20;
		}

		// Rechteck mit drawRect(...)
		int x = 150; 
		int y = 30; 
		for (int i = 0; i <= 5; i++)
		{
			grafik.setColor (farben[(int) (Math.random()*10)]);
			grafik.drawRect(x, y, 100, 50);
			x += 10; y += 20;
			
		}

		// Kreis mit drawOval
		x = 280; y = 30;  
		for (int i = 0; i <= 5; i++)
		{
			grafik.setColor (farben[(int) (Math.random()*10)]);
			grafik.drawOval(x, y, 80, 80);
			x += 10; y += 20;
			
		}

		// Kreis mit drawOval
		x = 500; y = 30;
		for (int i = 0; i <= 5; i++)
		{
			grafik.setColor (farben[(int) (Math.random()*10)]);
			grafik.fillOval(x, y, 80, 80);
			x -= 10; y += 20;
		}

		// Bogen mit drawArc
		x = 30; y = 280;
		for (int i = 0; i <= 10; i++)
		{	
			grafik.setColor(Color.white);
			grafik.drawArc(x, y, 100, 100, 0, 90);
			x += 10; 
		}

		// Bogen mit fillArc
		x = 200; y = 200;
		for (int i = 0; i <= 10; i++)
		{	
			grafik.setColor(farben[(int) (Math.random()*10)]);
			grafik.fillArc(x, y, 100, 100, 0, 90);
			x += 20; y += 10;
		}

	}
}
```

ich hoffe, dass jetzt mein Problem klarer formuliert ist, auch im Zusammenhang mit einem LayoutManager



_L-ectron-X hat diesen Beitrag am 04.02.2008 um 19:37 Uhr editiert._
_Code-Tags repariert._


----------



## L-ectron-X (4. Feb 2008)

Lies dir einfach mal meine Postings/Code insbesondere der Klasse DrawFrame durch, dann wirst du deinen Fehler finden.


----------



## bliko (4. Feb 2008)

Danke vielmals, habe etwas ungenau gelesen


----------

