【问题标题】:Putting a Panel on top of a JLabel backGround (Java)将面板放在 JLabel 背景之上(Java)
【发布时间】:2017-02-16 15:50:58
【问题描述】:

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

我有一个 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,0),但我将链接的图像显示情况并非如此。我的意思是,我尝试过 JLayeredPane 之类的东西或将 JLabel 设置为 Jframe 的内容窗格并使其透明,但似乎没有任何作用。两个对象中的一个或另一个完全覆盖另一个。

如您所见,这些对象根本没有对齐。 谁能帮我解决这个问题?

【问题讨论】:

    标签: java swing alignment


    【解决方案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 了解更改这些值如何影响布局的示例。

    【讨论】:

    • 你是个巫师。我花了很长时间试图弄清楚这一点,你让它完美地工作。非常感谢!
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2016-10-21
    • 2017-07-24
    • 2012-03-22
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多