我有以下代码:
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时,它会丢失背景和图像。我该如何防止这种情况?
答案 0 :(得分:1)
使用panel.setOpaque(false)
在子JPanel
个对象上设置无背景。
答案 1 :(得分:1)
看起来你的问题是container
是init
方法的本地作用域。所以你不能访问它(不是没有一些组件搜索框架)来添加其他组件(这是你想要做的)。
您可能正在尝试向框架中添加其他组件,并认为这会将其添加到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)
。