setBackground
отлично работает. Проблема связана со значением BorderLayout
JFrame
. Единственный компонент, который вы добавляете, это Test
JPanel
, которые расширяются размером JFrame
, из-за BorderLayout
, что в конечном итоге покрывает цвет фона. Если вы выберете Test
JPanel
, вы увидите цвет фона.
Вы также можете увидеть аффекта, ниже, настройки макета в GridBagLayout
к раме и установки preferredSize to the
JPanel`
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.*;
import javax.swing.border.TitledBorder;
public class Test extends JPanel {
public Test() {
setBorder(new TitledBorder("Panel size 300, 300"));
setBackground(Color.YELLOW);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
static void test() {
JFrame f = new JFrame("Test");
f.setLayout(new GridBagLayout());
f.getContentPane().setBackground(Color.blue);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new Test());
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
Причина GridbagLayout
работает потому, что она учитывает дочерние компоненты preferredSize
. Как вы можете видеть из this answer, некоторые Компоновка Менеджеры уважать предпочтительные размеры и некоторые не
вместо использования getContentPane(), просто сделать setBackground (Color.BLUE); * может быть установленBackgroundColor, не помню, но используйте кепки для цвета. * – user2277872