JPanel 中的 GridBagLayout 中的 JButton

JButton in GridBagLayout in a JPanel

我正在学习上周的 swing,我对 GridBagConstraints 有一些问题,无法在左上角放置一个按钮,但在 GridBagConstraints 中默认设置所有其他按钮?

我使用的代码不像原始代码但指出了问题

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
class MyPanel extends JPanel
{
    JButton menu = new JButton("Menu"), button = new JButton("Puzzle");

    GridBagConstraints gbc1 = new GridBagConstraints(), gbc2 = new GridBagConstraints();

    private void setup()
    {
        gbc1.anchor   = GridBagConstraints.FIRST_LINE_START;
        gbc2.anchor   = GridBagConstraints.CENTER;
        gbc2.weightx  = 1.0;
        gbc2.weighty  = 1.0;
    }

    public MyPanel()
    {
        this.setLayout(new GridBagLayout());
        this.setup();
        this.button.setPreferredSize(new Dimension(250, 140));
        this.add(menu, gbc1);
        this.add(button, gbc2);
    }
}

@SuppressWarnings("serial")
public class Test extends JFrame
{
    public Test()
    {
        this.setTitle("Test");
        this.setContentPane(new MyPanel());
        this.setResizable(false);
        this.setSize(800, 600);
        this.setVisible(true);
    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(() -> new Test());
    }
}

输出

我想要菜单在顶角。

我从 here 那里读到,但我不明白这个 你能解释一下 GridBagConstraints 如何做到这一点吗?

我希望这个问题很容易理解,如果没有,请在评论中告诉我。

编辑:

@camickr 建议可行但有点问题,拼图按钮不在提取中心。

谢谢。

默认情况下,GridBagLayout 将水平和垂直居中显示所有组件,除非其中一个组件的 weightx/weighty 值不等于 0。然后该组件将填充额外的 space框架。

因此,如果您想要一个组件位于“top/left”,一个组件位于“中心”,您需要:

  1. 使用“锚点”约束。这两个组件会有所不同。
  2. 中间的组件需要使用“weightx/weighty”约束。

但是,更简单的解决方案可能是使用具有不同布局管理器的面板组合。

例如:

JPanel menuPanel = new JPanel( new FlowLayout(FlowLayout.LEFT) );
menuPanel.add(menuButton);

JPanel centerPanel = new JPanel( new GridBagLayout() );
centerPanel.add(puzzle, new GridBagConstraints());

frame.add(menuPanel, BorderLayout.PAGE_START);
frame.add(centerPanel, BorderLayout.CENTER);

现在,框架的“顶部”将包含一个面板,其中的组件从左侧显示,而框架的“中心”将包含位于框架其余 space 中心的拼图。

编辑:

I solved it but put gridx and gridy to 0 in center component, but i did not completely understand the setttings

好吧,我提到过您需要使用 gridx/gridy 约束。您应该始终使用这些约束,因为很明显您想要将组件添加到哪个网格。本教程中的示例始终指定这些值。

使用 gridx/gridy 两者都等于 0,实际上没有意义。结果是您有两个组件试图共享同一个网格。

删除 setResizable(false) 语句并缩小框架的大小以查看按钮如何重新定位。

两个组件共享同一个网格是不正常的。通常,第一行是菜单,第二行是按钮。这将使按钮在框架中水平居中,在菜单下方的 space 中垂直居中。 你是干什么的