如何使用GridBagLayout设置JButton大小

时间:2015-04-25 08:32:10

标签: java layout-manager gridbaglayout

我想设置我的屏幕中心的JButton的大小变大,但我似乎无法使用GridBagLayouts找到如何做到这一点。

以下是它的样子: This is what it looks like

这是我的代码:

    //      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);

我希望按钮占据周围空白区域的更大部分。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

添加了更多信息:按钮具有宽度的50%和[约]父母高度的20%[一起50%高度,包括其间的空间]。 (稍微改写以符合建议。)

<强>解决方案

简单布局布局的组合。虽然如果你这样做,你将有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. 决定你的窗口是如何被构造的(它更像是彼此重叠的大水平组件PAGE_AXIS或彼此相邻的大垂直组件LINE_AXIS)并将其用作外部BoxLayout的:

    JPanel content = new JPanel(); // or frame
    content.setLayout(new BoxLayout(content, BoxLayout.LINE_AXIS));
    
  2. 沿着轴添加组件,在另一个轴上有多个组件,使用第二个BoxLayout。您可以通过创建刚性区域(空矩形始终具有相同的大小)或添加胶水(像胶一样扩展到组件)来分隔组件。

    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());
    

答案 2 :(得分:1)

button.setMargin( new Insets(50, 50, 50, 50) );

这将为按钮添加额外的空间,并允许布局管理员根据按钮的首选大小完成工作。