Java布局管理器垂直中心
我有一个面板,它使用组布局来组织一些标签。我想在重新调整尺寸时保持此面板在屏幕中央。如果我使用flow布局将面板放在另一个面板中,我可以保持标签水平居中,但不能垂直居中。哪种布局管理器允许我将面板集中在屏幕中间? 我还尝试了边框布局并将其放置在中间,但它会根据窗口大小调整大小。尝试使用边框布局并添加带有空对象的面板。Java布局管理器垂直中心,java,swing,layout,Java,Swing,Layout,我有一个面板,它使用组布局来组织一些标签。我想在重新调整尺寸时保持此面板在屏幕中央。如果我使用flow布局将面板放在另一个面板中,我可以保持标签水平居中,但不能垂直居中。哪种布局管理器允许我将面板集中在屏幕中间? 我还尝试了边框布局并将其放置在中间,但它会根据窗口大小调整大小。尝试使用边框布局并添加带有空对象的面板。 例如: public static void main(String[] args) { JFrame frame = new JFrame(); frame.se
例如:
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setLayout(new GridBagLayout());
JPanel panel = new JPanel();
panel.add(new JLabel("This is a label"));
panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see
frame.add(panel, new GridBagConstraints());
frame.setSize(400, 400);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
首先,我应该提到,阅读我关于布局的文章:。它很老,但非常有用(不幸的是,这篇文章的日期早于BoxLayout。当我在JavaOne上发表演讲时,我有一些幻灯片,其中包括位于的BoxLayout) 试试BoxLayout:
Box verticalBox = Box.createVerticalBox();
verticalBox.add(Box.createVerticalGlue());
verticalBox.add(stuffToCenterVertically);
verticalBox.add(Box.createVerticalGlue());
如果要将这些内容居中,请使用水平框作为内容垂直居中:
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(stuffToCenter);
horizontalBox.add(Box.createHorizontalGlue());
使用垂直和水平方向的
GroupLayout.Alignment.CENTER
,以及setPreferredSize(新尺寸(yourChosenWidth,yourChosenHeight))
将面板设置为不调整大小,在代码中比gridbag更容易“查看”
为了安全起见,您还可以在面板上设置MinimumSize和setMaximum size
如果你觉得很时髦,你可以只使用一个单一的组布局,通过仔细选择并行/顺序组并适当地对标签进行分组。你可以构建自己的布局管理器,使单个组件(两个轴或一个轴)居中。这是一个在两个轴上都做的,你可以很容易地将它改变为垂直或水平居中 当前的实现布局第一个可见的子项,您也可以更改它
public class CentreLayout implements LayoutManager, java.io.Serializable {
public void addLayoutComponent(String name, Component comp) {
}
public void removeLayoutComponent(Component comp) {
}
public Dimension preferredLayoutSize(Container target) {
return target.getPreferredSize();
}
public Dimension minimumLayoutSize(Container target) {
return target.getMinimumSize();
}
public void layoutContainer(Container target) {
synchronized (target.getTreeLock()) {
Insets insets = target.getInsets();
Dimension size = target.getSize();
int w = size.width - (insets.left + insets.right);
int h = size.height - (insets.top + insets.bottom);
int count = target.getComponentCount();
for (int i = 0; i < count; i++) {
Component m = target.getComponent(i);
if (m.isVisible()) {
Dimension d = m.getPreferredSize();
m.setBounds((w - d.width) / 2, (h - d.height) / 2, d.width, d.height);
break;
}
}
}
}
}
公共类CentreLayout实现LayoutManager,java.io.Serializable{
public void addLayoutComponent(字符串名称,组件组成){
}
公共void removeLayoutComponent(组件组件组件){
}
公共维度preferredLayoutSize(容器目标){
返回target.getPreferredSize();
}
公共维度最小布局大小(容器目标){
返回target.getMinimumSize();
}
公共void布局容器(容器目标){
已同步(target.getTreeLock()){
Insets Insets=target.getInsets();
维度大小=target.getSize();
int w=size.width-(插图左+插图右);
int h=尺寸高度-(插图顶部+插图底部);
int count=target.getComponentCount();
for(int i=0;i
我同意GridBagLayout通常更复杂,但对于单个面板的居中,它只有两行。问题是,在阅读代码时,您无法“看到”这一点。。。(我将我的答案编辑为“看到”而不是“更容易”…)我“看到”。。。但另一方面,“createVerticalGlue()”对我来说也毫无意义,如果不阅读文档的话。。。但给出的提示比空的GridBagConstraints稍多一些;)我同意你会有更多的运气与框布局。它们比GridBag更容易使用。不管你选择什么,读一点文档(至少是Swing布局示例文档,它很短)总是一个好主意。不幸的是,这对我不起作用。我在方法preferredLayoutSize
中遇到了堆栈溢出(哈哈)。我一直想知道如何做到这一点,最后我放弃了,改用MigLayout。当容器小于子容器的首选大小(但大于最小大小)时,GridBagLayout很难失败。