Java NetBeans,以组件为中心的GUI生成器(组布局)
我正在尝试设计一个JButton(一个“Ok”按钮),它必须在包含JFrame的框架中水平居中,才能看起来很好Java NetBeans,以组件为中心的GUI生成器(组布局),java,swing,netbeans,grouplayout,Java,Swing,Netbeans,Grouplayout,我正在尝试设计一个JButton(一个“Ok”按钮),它必须在包含JFrame的框架中水平居中,才能看起来很好 我将GUI生成器与自由表单布局(GroupLayout)一起使用 我已经学习了几个GUI builder教程(http://netbeans.org/kb/docs/java/quickstart-gui.html)但是还没有找到这个话题。在其他gui构建器(delphi)中,这可以通过从两个边缘移除锚来完成如果要在调整容器大小时使组件保持其容器的中心位置,您可以使用多个选项,但我不认
我将GUI生成器与自由表单布局(GroupLayout)一起使用
我已经学习了几个GUI builder教程(http://netbeans.org/kb/docs/java/quickstart-gui.html)但是还没有找到这个话题。在其他gui构建器(delphi)中,这可以通过从两个边缘移除锚来完成
如果要在调整容器大小时使组件保持其容器的中心位置,您可以使用多个选项,但我不认为GroupLayout是其中之一(如果我错了,请纠正我)。一种方法是将容器的布局更改为GridBagLayout,然后简单地将JButton添加到其中而不受任何约束。尝试
GridBagLayout
请参见尝试另一个LayoutManager!
当只看NetBeans生成的代码时,GroupLayout是非常模糊的
如果您使用了,那么您需要的是:
DesignGridLayout layout = new DesignGridLayout(container);
layout.row().center().add(okButton);
javax.swing.Box.Filler
可用于在GroupLayout中的组件周围填充空间。在NetBeans Matisse(GUI构建器)中,它们在调色板的“摆动填充”部分下被称为“水平支柱”。只需在按钮两侧各放一个,调整大小以填充按钮和容器边缘之间的所有空白,并确保它们都标记为水平自动调整大小
至于使用另一个LayoutManager,我知道人们不喜欢GroupLayout,因为它不利于手动编码。这是故意的。正如上面所说,GroupLayout旨在供GUI构建者使用。因此,只要您愿意在GUI的整个生命周期中使用NetBeans和Matisse,GroupLayout就是最好的选择。
GroupLayout
确实支持组件的中心化。这是一个非常有能力的项目
布局管理器。我个人把它放在MigLayout
经理之后和之前
FormLayout
管理器
在以下三个示例中,我们有一个面板和一个按钮。按钮
是水平居中的
以NetBeans Builder为中心
要使用Netbeans生成器使组件居中,我们需要创建
按钮两侧的水平可调整间隙
屏幕截图的绿色区域是当前选定的间隙。弦
内部间隙表明这是一个可调整大小的间隙
在表单上放置构件时,会自动添加间隙。
要定义可调整大小的间隙,我们右键单击间隙并选择
“编辑布局空间”选项。我们将获得以下对话框:
要获得可调整大小的间隙,请选中“可调整大小”复选框
使用平行组手动定心
组件可以通过传递在平行组中居中
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);
}
});
}
}
情况是(我认为这是非常常见的)您有一个包含许多控件的表单。控件的布局使GroupLayout成为一个完美的选择。除了末端的按钮,它应该居中。当然,我可以在页面的末尾放置一个JPanel,使其水平调整大小,并将JButton放入其(默认)居中的FlowLayout中。但问题来自于这样一个事实,即在其他GUI构建器(没有那么复杂)中,比如Delphi的一个,居中是锚定逻辑的一个birllant扩展。不将控件锚定到任何位置意味着让它“浮动”在中心。@AgostinoX使用此
LayoutManager
Pete,您会有很多惊喜+1@mKorbel,听到这个我不太高兴:-)。你能提供一些例子吗?关于什么,关于什么1)检查充满鳗鱼历史的气垫船,他喜欢这个布局经理2)我知道这些幼稚但基本的例子都是可能的:-),3),4),@AgostinoX这个主题以JComponent为中心
在这个论坛上解决了很多次,@jfpoilpret:它提供gui构建器吗?当使用designGridLayout时,不需要gui构建器,这就是它的力量所在!您编写的代码直接表达了您想要的布局。只需阅读代码,就可以立即看到所获得的布局。没有GUI生成器,没有难看或复杂的代码生成,除了简化初始编码外,还大大简化了维护。DesignGridLayout API非常简单,您只需花一两个小时阅读网站上的介绍和示例,就可以理解如何使用它并制作自己的布局。