将面板放在JLabel backGround(Java)之上

时间:2016-10-07 15:22:18

标签: java swing alignment

我一直在搜索互联网上毫无结果,人们建议的任何内容似乎对我都没有任何影响。

我有一个JFrame,我试图将JPanel放进去。那个JPanel理想情况下会有一个带有imageicon作为背景的JLabel和一个位于前台的Jpanel中的一组按钮。问题是每种类型的布局管理器我已经看到建议只是不像我所宣传的那样工作。到目前为止,我所做的最好的工作是这种方法:

public MenuBackgroundPanel(AsteroidsFrame frame)
{
    this.gameFrame = frame;

    this.setLayout(new OverlayLayout(this));
    ImageIcon image = new ImageIcon(getClass().getResource("/resources/background1.gif"));
    imageLabel = new JLabel(image, JLabel.CENTER);
    mp = new MainMenuPanel(gameFrame);
    mp.setMaximumSize(new Dimension(300,200));

    this.add(mp);
    this.add(imageLabel);

    this.setVisible(true);
}

不幸的是,我得到了非常奇怪的对齐并试图在背景上设置位置(实际上让它从JFrame开始#0;或者移动按钮面板似乎有没有效果。打印每个对象的位置表示他们都在(0,0),但图像链接显示情况并非如此。我的观点是,我已经尝试过了比如JLayeredPane或者将JLabel设置为Jframe的内容窗格并使其透明,但似乎什么也没做。两个对象中的一个或另一个完全覆盖另一个。

http://i.imgur.com/ll5Y3j5.png

如您所见,对象根本没有对齐。 有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

  

JPanel理想情况下会有一个带有imageicon作为背景的JLabel和一个位于前台的Jpanel中的一组按钮

当子面板完全包含在标签图像中时,最简单的方法就是设置JLabel的布局管理器,然后将组件添加到标签中。

JLabel background = new JLabel( new ImageIcon(...) );
background.setLayout( new GridBagLayout() );
JPanel buttons = new JPanel();
buttons.setOpaque( false );
buttons.add(...);
background.add(buttons, new GridBagConstraints() );

现在按钮面板将在标签上居中。

  

如您所见,对象完全没有对齐

如果要使用OverlayLayout,则需要使用每个组件的alignmentX / Y属性。您可能希望将它们都设置为.5。请查看:Java Layout with Component always in Top Right,了解更改这些值如何影响布局的示例。