【问题标题】:How to position buttons?如何定位按钮?
【发布时间】:2015-03-29 12:05:14
【问题描述】:

如何将按钮准确定位在我想要的位置。 我有一个背景图像设置到主面板。然后 2 个按钮彼此相邻但我希望它们位于中心。像在主菜单中一样彼此重叠。

我已经尝试了所有方法,但最接近我的方法是使用 Box Layout。这是它的外观的代码和图像。但我需要将按钮放在中间。

public Menu() {
    JFrame frame = new JFrame("Fruit Catcher");
    JPanel panel = new JPanel();

    frame.add(panel);


    ImageIcon junglebackground = new ImageIcon("junglebackground.jpg");
    JLabel backgroundimage = new JLabel(junglebackground);

    frame.add(backgroundimage);
    frame.setSize(700,470);
    frame.setResizable(false);
    frame.setVisible(true);


    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));        

    JButton Play = new JButton("Play");
    JButton Scoreboard = new JButton("Scoreboard");
    Play.setAlignmentX(Component.CENTER_ALIGNMENT);
    JLabel gap = new JLabel("\n");
    Scoreboard.setAlignmentX(Component.CENTER_ALIGNMENT);


    buttonPanel.add(Play);
    buttonPanel.add(gap);
    buttonPanel.add(Scoreboard);



    frame.add(buttonPanel);


}

【问题讨论】:

  • 我目前正在尝试 BoxLayout。到目前为止,这是我如何使用这种布局的按钮。我需要他们处于中心位置,并且在他们之间有一个间隙。 puu.sh/gTXRV/763f288711.jpg
  • 不要在 cmets 中发布附加信息。如果您想为问题添加新信息,请使用edit 链接。

标签: java swing button position awt


【解决方案1】:

嵌套 JPanel

  • 将按钮放在使用 GridLayout(0, 1, 0, vertGap) 的 JPanel 中,它代表具有可变行数、1 列、0 个水平间隙(因为只有一列)和 vertGap 垂直间隙的网格——一个 int 值, 必须做出决定。
  • 然后将此 JPanel 放入您的主 JPanel。
  • 如果您希望它位于顶部并居中,您可以让主 JPanel 简单地使用其默认 FlowLayout。
  • 如果您希望使用 JPanel 通过 GridLayout 显示图像,请务必通过调用 setOpaque(false) 将其设置为非透明。
  • 最重要的是,阅读 Swing 教程中的如何使用布局管理器。您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info

【讨论】:

  • 没有找到 vertGap 只是不断出现为 vertGap 创建变量或字段。
  • @DontMatter:然后按照它所说的去做——要么在那个位置使用一个数字,要么创建一个变量。
【解决方案2】:

您应该进一步阅读您对摇摆的任何介绍。稍后,他们一定会谈到 Layouts,这是定义按钮在窗口中的布局方式的方法。

您所描述的内容听起来您可以通过一些网格布局来解决它,但很难猜出您到底需要什么,所以最好自己弄清楚。

【讨论】:

    【解决方案3】:

    由于您知道背景图像比您要显示的按钮大,您可以使用 JLabel 作为按钮的容器。基本代码是:

    JFrame frame = new JFrame("Fruit Catcher");
    
    ImageIcon jungleBackground = new ImageIcon("junglebackground.jpg");
    JLabel backgroundImage = new JLabel(junglebackground);
    frame.add( backgroundImage)
    

    现在您需要将按钮添加到标签。两种选择:

    在标签上使用BoxLayout

    backgroundImage.setLayout(new BoxLayout(backgroundImage, BoxLayout.Y_AXIS));  
    backgroundImage.add( Box.createVerticalGlue() );
    backgroundImage.add( new JButton("Play") );
    backgroundImage.add( Box.createVerticalStrut(20) );
    backgroundImage.add( new JButton("Scoreboard") );
    backgroundImage.add( Box.createVerticalGlue() );
    

    阅读 How to Use Box Layout 上的 Swing 教程部分,了解更多信息和示例。

    另一种选择是在标签上使用GridBagLayout

    backgroundImage.setLayout( new GridBagLayout() );
    GridBagConstraints gbc = new GridBagConstraints();
    
    backgroundImage.add(new JButton("Play"), gbc);
    gbc.gridy = 1;
    gbc.insets = new Insets(10, 0, 0, 0);
    backgroundImage.add(new JButton("Scoreboard"), gbc);
    

    不要忘记阅读教程以获取有关 GridBagConstraints 的更多信息。

    最后,一旦所有组件都添加到框架中,您将执行以下操作:

    frame.pack();
    frame.setResizable(false);
    frame.setVisible(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2021-05-21
      • 2018-10-11
      相关资源
      最近更新 更多