在JFrame中有多个带有背景的JPanel?

时间:2014-10-21 09:23:02

标签: java swing jframe jpanel

我有以下代码:

public void init() {
    setLayout(new BorderLayout(0, 0));
    setIconImage(ResourceUtility.getImage("logo.png").getImage());
    final JPanel container = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(logo, getWidth() / 2 - logo.getWidth(null) / 2, getHeight() - (int) (getHeight() * 0.90), null);
        }
    };
    container.setBackground(UIConfiguration.ColorRedDark);
    add(container);

    pack();
    setLocationRelativeTo(null);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setExtendedState(MAXIMIZED_BOTH);
    setMaximumSize(UIConfiguration.screenSize);
    setVisible(true);
}

现在,当我尝试在其下添加另一个JPanel时,它会丢失背景和图像。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:1)

使用panel.setOpaque(false)在子JPanel个对象上设置无背景。

答案 1 :(得分:1)

看起来你的问题是containerinit方法的本地作用域。所以你不能访问它(不是没有一些组件搜索框架)来添加其他组件(这是你想要做的)。

您可能正在尝试向框架中添加其他组件,并认为这会将其添加到container。只需执行add(secondPanel)即可将另一个组件添加到框架中。这基本上(框架BorderLayout)隐含地是add(secondPanel, BorderLayout.CENTER)。但是您已经完成add(container),这与add(container, BorderLayout.CENTER)相同,并且每个位置只能有一个组件。因此conatiner被踢出,只留下secondPanel

因此,一个简单的解决方法就是从container方法中取出init声明,并将组件添加到container

另请注意,JPanels默认情况下是不透明的,因此将JPanel添加到container会导致JPanels背景覆盖container背景。因此,如果你想要和container的JPanel,请确保在JPanel上setOpaque(false)