2013-07-31 10 views
5

Ich habe ein JPanel als ContentPane meines JFrame gesetzt.In meinem Swing-Programm kann JPanels Hintergrund nicht eingestellt werden.

Wenn ich:

jPanel.setBackground(Color.WHITE); 

Die weiße Farbe nicht angewendet wird.

Aber wenn ich benutze:

jFrame.setBackground(Color.WHITE); 

Es funktioniert ... Ich bin von diesem Verhalten überrascht. Es sollte das Gegenteil sein, oder?

SSCCE:

Hier ist ein SSCCE:

Hauptklasse:

public class Main { 
    public static void main(String[] args) { 
     Window win = new Window(); 
    } 
} 

Fensterklasse:

import java.awt.Color; 
import javax.swing.JFrame; 

public class Window extends JFrame { 
    private Container mainContainer = new Container(); 

    public Window(){ 
     super(); 
     this.setTitle("My Paint"); 
     this.setSize(720, 576); 
     this.setLocationRelativeTo(null); 
     this.setResizable(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainContainer.setBackground(Color.WHITE); //Doesn't work whereas this.setBackground(Color.WHITE) works 
     this.setContentPane(mainContainer); 
     this.setVisible(true); 
    } 
} 

Container Klasse:

import java.awt.Graphics; 
import javax.swing.JPanel; 

public class Container extends JPanel { 
    public Container() { 
     super(); 
    } 
    public void paintComponent(Graphics g) { 
    } 
} 
+0

was ist die Größe des JPanel? Wird das Inhaltsfenster vollständig ausgefüllt? – bas

+0

Für bessere Hilfe früher ein [SSCCE] (http://sscce.org/) – Reimeus

+0

Ich habe nicht die Größe meines jPanel. Ich dachte, wenn Sie es als contentPane setzen, war es automatisch die gleiche Größe wie der entsprechende jFrame. – MarAja

Antwort

3

Der Grund ist sehr einfach die folgende Zeile

super.paintComponent(g); 

wenn Sie paintcomponent außer Kraft setzen.

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

Jetzt funktioniert es perfekt.

Sie sollten dies immer tun, wenn Sie nicht einen ganz bestimmten Grund dafür haben.

[PS: Ändern Sie die Farbe rot oder etwas dunkler, um den Unterschied zu bemerken, wie manchmal wird es schwierig, zwischen JFrame ‚s grauen Standardfarbe und weiße Farbe zu unterscheiden]

+0

1+ für guten Rat. –

1

Mit meinem Testcode funktioniert es so, wie Sie es erwartet:

public class Main { 

     public static void main(String[] args) { 

      JFrame f = new JFrame(); 
      f.setSize(new Dimension(400,400)); 
      f.setLocationRelativeTo(null); 

      JPanel p = new JPanel(); 
      p.setSize(new Dimension(20,20)); 
      p.setLocation(20, 20); 

      //comment these lines out as you wish. none, both, one or the other 
      p.setBackground(Color.WHITE); 
      f.setBackground(Color.BLUE); 

      f.setContentPane(p); 

      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setVisible(true); 

     } 
     } 
+0

Der Benutzer hat nach einem Problem in seinem spezifischen Code gefragt, nicht nach einer Arbeitsmethode/einem Code. Wie auch immer Sie eine Alternative setzen. Gut. –

Verwandte Themen