以组件为中心的NetBeans,GUI构建器(组布局)

时间:2011-10-10 10:17:06

标签: java swing netbeans grouplayout

我正在尝试设计一个看起来不错的JButton(一个“Ok”按钮)必须在包含JFrame中水平居中。
我正在使用带有自由格式布局(GroupLayout)的GUI Builder。

我已经参加了几个GUI构建器教程(http://netbeans.org/kb/docs/java/quickstart-gui.html),但是没有找到这个主题。在其他gui构建器(delphi)中,这可以通过从两个边缘移除锚来完成。

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

以NetBeans Builder为中心

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

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

NetBeans screenshot

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

NetBeans screenshot

为了获得可调整大小的差距,我们选中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);
            }
        });
    }
}

enter image description here

答案 2 :(得分:2)

尝试GridbagLayout请参阅this

答案 3 :(得分:2)

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

如果您使用DesignGridLayout,那么您需要的就是:

DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);

答案 4 :(得分:1)

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

至于使用另一个LayoutManager,我知道人们不喜欢GroupLayout,因为它不利于手动编码。那是设计上的。正如docs所说,GroupLayout旨在供GUI构建者使用。所以,只要你能将自己与使用NetBeans& Matisse为您的GUI生活,GroupLayout确实是最好的选择。