无法在我的Swing程序中设置JPanel的Background。

时间:2013-07-31 11:56:59

标签: java swing jpanel

我将JPanel设置为我的JFrame的contentPane。

当我使用时:

jPanel.setBackground(Color.WHITE);

不应用白色。

但是当我使用时:

jFrame.setBackground(Color.WHITE);

它有效......我对这种行为感到惊讶。它应该是相反的,不应该吗?

SSCCE:

这是一个SSCCE:

主类:

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

窗口类:

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

容器类:

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

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

2 个答案:

答案 0 :(得分:3)

原因很简单,包括以下一行

super.paintComponent(g);
当你覆盖paintComponent时

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

现在它完美无缺。

除非您有非常具体的理由,否则您应该始终这样做。

[PS:将颜色更改为红色或更深的颜色以注意差异,因为有时难以区分JFrame的默认灰色和白色颜色]

答案 1 :(得分:1)

使用我的测试代码,它的工作方式与预期的方式相同:

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);

         }
      }