7

I'm trying to design a JButton (an "Ok" button) that to look good has to be horizontally centered in the containing JFrame.
I'm using the GUI Builder with the Free Form layout (GroupLayout).

I've taken several GUI builder tutorials (http://netbeans.org/kb/docs/java/quickstart-gui.html) but haven't found this topic. In other gui builders (delphi) this can be done by removing the anchors from both edges.

4

5 回答 5

6

GroupLayout确实支持组件的居中。它是一个非常有能力的布局管理器。我个人把它放在MigLayout经理之后和经理之前FormLayout

在以下三个示例中,我们有一个面板和一个按钮。该按钮水平居中。

使用 NetBeans Builder 居中

要使用 Netbeans Builder 使组件居中,我们需要从按钮的两侧创建可调整大小的水平间隙。

屏幕截图的绿色区域是当前选定的间隙。间隙内的字符串表明这是一个可调整大小的间隙。

NetBeans 屏幕截图

当我们在表单上放置组件时,会自动添加间隙。要定义可调整大小的间隙,我们右键单击间隙并选择“编辑布局空间”选项。我们得到以下对话框:

NetBeans 屏幕截图

要获得可调整大小的差距,我们选中 Resizable 复选框。

使用平行组手动居中

GroupLayout.Alignment.CENTER通过传递参数,组件可以在并行组中居中。

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.Alignment.CENTER;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter extends JFrame {

    public GroupLayoutCenter() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup(CENTER)
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
           .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
           .addComponent(btn)            
        );          

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter ex = new GroupLayoutCenter();
                ex.setVisible(true);
            }
        });
    }
}

使用间隙手动居中

这个解决方案就是 NetBeans 生成的代码所做的。我们在按钮的左侧和右侧放置了两个可调整大小的间隙。

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import static javax.swing.GroupLayout.DEFAULT_SIZE;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GroupLayoutCenter2 extends JFrame {

    public GroupLayoutCenter2() {

        initUI();

        setTitle("Centered button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);        
    }

    private void initUI() {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);    

        gl.setAutoCreateGaps(true);
        gl.setAutoCreateContainerGaps(true);

        JPanel pnl = new JPanel();
        pnl.setBorder(BorderFactory.createEtchedBorder());

        JButton btn = new JButton("Button");

        gl.setHorizontalGroup(gl.createParallelGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addGroup(gl.createSequentialGroup()
                        .addGap(5, 100, Short.MAX_VALUE)
                        .addComponent(btn)
                        .addGap(5, 100, Short.MAX_VALUE))
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(pnl, DEFAULT_SIZE, 200, DEFAULT_SIZE)
                .addComponent(btn)
        );    

        pack();
    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                GroupLayoutCenter2 ex = new GroupLayoutCenter2();
                ex.setVisible(true);
            }
        });
    }
}

在此处输入图像描述

于 2014-08-06T22:30:33.190 回答
5

如果您希望您的组件在容器调整大小时保持在其容器的中心,您可以使用几个选项,但我不认为 GroupLayout 是其中之一(如果我错了,请纠正我)。一种方法是将容器的布局更改为 GridBagLayout,然后简单地将 JButton 添加到其中,没有任何约束。

于 2011-10-10T10:56:31.733 回答
2

javax.swing.Box.Filler可用于在 GroupLayout 内的组件周围填充空间。在 NetBeans Matisse(GUI Builder)中,它们在调色板的“Swing Fillers”部分下被称为“Horizo​​ntal Strut”。只需在按钮的任一侧放置一个,调整它们的大小以填充按钮和容器边缘之间的所有空白空间,并确保它们都标记为水平自动调整大小。

至于使用另一个 LayoutManager,我知道人们不喜欢 GroupLayout,因为它不利于手动编码。这是设计使然。正如文档所说,GroupLayout 旨在供 GUI 构建器使用。因此,只要您愿意在 GUI 的整个生命周期中使用 NetBeans 和 Matisse,GroupLayout 确实是最佳选择。

于 2012-03-26T19:09:58.663 回答
2

尝试另一个 LayoutManager!仅查看 NetBeans 生成的代码时,GroupLayout 非常模糊。

如果您使用DesignGridLayout,那么您需要的很简单:

DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);
于 2011-10-10T12:33:08.453 回答
2

试试看这个GridbagLayout_

于 2011-10-10T11:12:13.463 回答