setBackground bei JFrame und JPanel

Status
Nicht offen für weitere Antworten.

bliko

Mitglied
Ich habe die folgende Datei geschrieben, das Setzen des Hintergrundes aber funktioniert nicht.
Code:
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

Bekanntes Mitglied
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:

Code:
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:

Code:
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

Mitglied
ich habe nun folgende Version versucht
Code:
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

Bekanntes Mitglied
mach mal aus deinem
Code:
super.paintComponents(g);
ein
Code:
super.paintComponent(g);
also das s weg
dann nimmt er auch deinen Hintergrund von JPanel
 

L-ectron-X

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

Code:
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);
   }
}

Code:
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);
   }
}
 

L-ectron-X

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

outbreaker

Bekanntes Mitglied
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:
 

outbreaker

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

Mitglied
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!
Code:
//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);
    }
 }

Code:
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

Gesperrter Benutzer
Lies dir einfach mal meine Postings/Code insbesondere der Klasse DrawFrame durch, dann wirst du deinen Fehler finden.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JButton setBackground() färbt nicht den ganzen Knopf Java Basics - Anfänger-Themen 4
S setBackground via WindowListener Java Basics - Anfänger-Themen 1
D JButton Array setBackground Java Basics - Anfänger-Themen 2
T canvas.setBackground(); Java Basics - Anfänger-Themen 2
O Probleme mit void java.awt.Component.setBackground(Color c) Java Basics - Anfänger-Themen 2
S Zeitpunkt für die Anzeige von setBackground Java Basics - Anfänger-Themen 2
R jLabel.setBackground - falsch angewendet? Java Basics - Anfänger-Themen 2
E setBackground(.) Java Basics - Anfänger-Themen 6
R setBackground() ohne Wirkung ? Java Basics - Anfänger-Themen 7
G JEditorPane setBackground() Java Basics - Anfänger-Themen 4
C setBackground Java Basics - Anfänger-Themen 3
G Problem mit setBackground Java Basics - Anfänger-Themen 5
bernd setBackground(... Java Basics - Anfänger-Themen 2
fragenÜber(fragen); Turtle Grafik mit GUI (JFrame) Java Basics - Anfänger-Themen 3
E JFrame + Buffer-strategy Java Basics - Anfänger-Themen 8
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
B HSQL mit JFrame steuern Java Basics - Anfänger-Themen 4
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
D Erste Schritte png in JFrame anzeigen? Java Basics - Anfänger-Themen 3
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
S Kontrollieren ob jframe disposed ist Java Basics - Anfänger-Themen 3
Elyt JFrame in den Hintergrund verschieben Java Basics - Anfänger-Themen 3
OSchriever JFrame-Anwendungsfenster verschieben Java Basics - Anfänger-Themen 17
M Bild in JFrame Java Basics - Anfänger-Themen 1
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S JFrame mit Hintergrundbild und Button Java Basics - Anfänger-Themen 4
S JFrame Java Basics - Anfänger-Themen 15
I JFrame proportional verkleinerbar machen Java Basics - Anfänger-Themen 3
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
T Auslagern von Methoden bei einem JFrame Java Basics - Anfänger-Themen 6
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
J JFrame Fenster öffnet sich nicht Java Basics - Anfänger-Themen 7
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
R JFrame nicht verschiebbar Java Basics - Anfänger-Themen 2
T Wenn JFrame Textfelder Hintergrund Grün dann... (if) Java Basics - Anfänger-Themen 3
K Java JFrame mit Hintergrundbild erstellen Java Basics - Anfänger-Themen 1
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
H Eclipse JFrame Java Basics - Anfänger-Themen 3
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
I JFrame minimieren wenn anderes Programm minimiert wird Java Basics - Anfänger-Themen 1
K Methoden Methode starten wenn JFrame geöffnet wird Java Basics - Anfänger-Themen 2
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
B Ist MyFrame oder JFrame besser? Java Basics - Anfänger-Themen 3
Y JFrame sichtbarkeit Java Basics - Anfänger-Themen 4
KeVoZ_ Label auf JFrame willkürlich Positionieren Java Basics - Anfänger-Themen 2
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
P JFrame nur einmal öffnen Java Basics - Anfänger-Themen 4
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
V Tastatur initialisieren JFrame Probleme Java Basics - Anfänger-Themen 6
J JPG in JFrame anzeigen lassen Java Basics - Anfänger-Themen 3
J JFrame ausgabe von Werten Java Basics - Anfänger-Themen 9
F GUI als Klasse oder extend JFrame? Java Basics - Anfänger-Themen 6
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
L [JFrame] Exception - woher? Java Basics - Anfänger-Themen 8
thomasbomme Grafikfehler JFrame- Cleartype Java Basics - Anfänger-Themen 1
GreyFox Arbeit mit JFrame Java Basics - Anfänger-Themen 8
T Erste Schritte 2 Codes zusammen fügen / Label in JFrame Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
dat_vin JFrame öffnet sich mehrmals Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
M Rahmen für undekorierten JFrame Java Basics - Anfänger-Themen 6
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
B Erste Schritte JFrame in Klasse auslagern Java Basics - Anfänger-Themen 4
H JFrame komplett schließen Java Basics - Anfänger-Themen 3
S Brauche hilfe bei Pong (JFrame) Java Basics - Anfänger-Themen 2
M hintergrund in jframe festlegen Java Basics - Anfänger-Themen 4
J JFrame Render Fehler - Warum? Java Basics - Anfänger-Themen 2
I komponenten werden in JFrame nicht richtig angezeigt Java Basics - Anfänger-Themen 1
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
D Best Practice JFrame im JFrame Java Basics - Anfänger-Themen 2
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
S Erste Schritte Von JFrame in nächstes JFRame wechseln Java Basics - Anfänger-Themen 0
V JFrame aktualisieren Java Basics - Anfänger-Themen 6
S JFrame ist nicht schwarz Java Basics - Anfänger-Themen 5
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
S JFrame wird nicht "bemalt" Java Basics - Anfänger-Themen 2
M Unsichtbare Objekte in JFrame Java Basics - Anfänger-Themen 2
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
Sogomn JLabel in anderer Klasse zum JFrame hinzufügen Java Basics - Anfänger-Themen 2
B Drawline wird auf JFrame nicht angezeigt Java Basics - Anfänger-Themen 3
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
K Methoden Objekt auf JFrame zeichnen Java Basics - Anfänger-Themen 16
S JFrame leeren Java Basics - Anfänger-Themen 6
X JFrame Fenster einzeln schließen Java Basics - Anfänger-Themen 2
J Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben