如何使用 GridBagLayout 设置 JButton 大小

How to set JButton size with GridBagLayout

我想将位于屏幕中央的 JButton 的大小设置得更大,但我似乎无法找到如何使用 GridBagLayout 来做到这一点。

这是它的样子:

这是我的代码:

    //      Client
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    c.gridy = 5;
    c.gridx = 5;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.insets = new Insets(10, 1, 1, 10);
    p.add(b[0], c);

    //      Server
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    c.gridy = 10;
    c.gridx = 5;
    c.gridwidth = 1;
    c.gridheight = 1;
    c.insets = new Insets(10, 1, 1, 10);
    p.add(b[1], c);

我希望按钮占据周围空白 space 的较大部分。

我无法想象你想要什么,但如果你想让你的按钮填充周围,你可以添加

    c.weightx = ...; //Specifies how to distribute extra horizontal space. 
    or c.weighty = ...; //Specifies how to distribute extra vertical space. 

添加了更多信息:按钮具有父级宽度的 50% 和 [大约] 20% 的高度 [总计 50% 高度,包括中间的 space。 (稍微重写以符合建议。)

解决方案

简单布局布局的组合。虽然如果你这样做,你将有 3 列或 3 行无法连接,其余的稍后可以轻松更改:

// row variation

JPanel parent = new JPanel();
parent.setLayout(new GridLayout(3, 1));

parent.add(new JPanel()); // placeholder for 1st row

JPanel row = new JPanel(); // 2nd row
row.setLayout(new GridLayout(1, 3)); // create 3 cells of equal size

row.add(new JPanel()); // 2nd row, 1st cell placeholder

// now you have a 33% x 33% (oops) rectangle in the middle
JPanel controls = new JPanel();
controls.setLayout(new GridLayout(2, 1, 10, 10));
controls.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10);
controls.add(new JButton("Client"));
controls.add(new JButton("Server"));

row.add(controls); // add 2nd row, 2nd cell

row.add(new JPanel()); // 2nd row, 3rd cell placeholder

parent.add(row); // add 2nd row

parent.add(new JPanel()); // placeholder for 3rd row

简单,但您稍后将无法加入单元格:

JPanel parent = new JPanel(); parent.setLayout(newGridLayout(9, 9));

底线:结合不同的布局管理器,将您的 2 个按钮放在一个面板中并在其中放置一些占位符,然后它也应该可以与 GridBagLayout 一起正常工作。 也就是说,我会尝试通过编写 可重用组件 来保持灵活性,这些组件可以轻松地与任何布局管理器结合使用。这样您就不必为了正确显示组件而使用占位符多余的代码。

旧答案

备选方案:使用 BoxLayout

BoxLayout在看代码的时候更加直观易懂(当然这只是个人意见)

  1. 确定您的 window 的结构(它更像是彼此重叠的大水平组件 PAGE_AXIS 还是彼此相邻的大垂直组件 LINE_AXIS) 并将其用作外部 BoxLayout:

    JPanel content = new JPanel(); // or frame
    content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
    
  2. 沿轴添加组件,如果沿另一轴有多个组件,请使用第二个 BoxLayout。您可以 space 通过创建刚性区域(空矩形始终具有相同大小)或添加胶水(像口香糖一样与组件一起膨胀)来组件。

    content.add(BoxLayout.createHorizntalGlue());
    
    JPanel col = new JPanel();
    col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS));
    JButton clientBtn = new JButton("Client");
    JButton serverBtn = new JButton("Server");
    col.add(BoxLayout.createVerticalGlue());        
    col.add(clientBtn);
    col.add(BoxLayout.createRigidArea(new Dimension(1, 10)));
    col.add(serverBtn);
    col.add(BoxLayout.createVerticalGlue());
    content.add(col);
    
    content.add(BoxLayout.createHorizontalGlue());
    
button.setMargin( new Insets(50, 50, 50, 50) );

这将向按钮添加额外的 space 并允许布局管理器根据按钮的首选大小完成他们的工作。