【问题标题】:GridBagLayout one cell alignment for labelGridBagLayout 一个单元格对齐标签
【发布时间】:2012-11-16 18:43:47
【问题描述】:

例如,我在网格布局中有 3x3 组件,我希望它们都是标签,但是由于我有一些填充,我希望我的标签位于它们的单元格的中心。但我似乎无法管理它......

部分相关代码:

panel = new JPanel();
GridBagLayout gridBag = new GridBagLayout();
panel.setLayout(gridBag);
panel.setSize(new Dimension(30, 400));
GridBagConstraints c = new GridBagConstraints()     

JLabel lab = new JLabel("proba"); 
lab.setBorder(outline);
c.fill = GridBagConstraints.BOTH;
c.gridx =2; c.gridy=2; c.ipady = 10; c.ipadx=10;

c.ipadx=100; panel.add(lab,c);

【问题讨论】:

  • 1) “部分相关代码:” 为尽快获得更好的帮助,发SSCCE。 2) 将组件(或一组组件)居中的一种快速简单的方法是将(或它们)放入一个面板中,然后将面板放入另一个面板中,并使用GridBagLayout 没有约束,即然后添加到最外层的 GBL。您可以在Nested Layout Example 中看到的红色/橙色图像中看到一个示例。

标签: java swing gridbaglayout


【解决方案1】:

[更新]

您确实应该发布SSCCE,这样我们都可以尝试,而不必猜测问题出在哪里。我的最后一个猜测——不管它是否能解决你当前的问题,这是你应该做的事情——是

    label.setHorizontalAlignment(JLabel.CENTER);

如果您的标签居中并填充整个网格单元格,则默认情况下文本仍将左对齐。上述更改将导致文本在标签内居中。

但是,如果您的标签没有填充单元格,这将无济于事。

[原创]

由于这不是一个完整的程序,所以很难确切地说出了什么问题,但这里有一些 cmet 可能会让你走上正轨。

首先,您应该使用 setPreferredSize 而不是 setSize(请参阅 Java: Difference between the setPreferredSize() and setSize() methods in components

当您进行此更改时,您会发现面板并不是您想要的。它又高又瘦。也许是一个错字 - 你的意思是 (300,400) 而不是 (30,400)

现在我猜你所有的标签都会聚集在一起。为了让他们到达spread out,您需要添加:

c.weightx = .5;
c.weighty = .5;

(实际上任何非零值都可以)。这在http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html中有描述

除非您为 weightx 或 weighty 指定至少一个非零值,否则所有组件都会在其容器的中心聚集在一起。这是因为当权重为 0.0(默认值)时,GridBagLayout 会在其单元格网格和容器边缘之间放置任何额外的空间。

这应该让你接近(r)......

【讨论】:

  • 好的,所以我明白了你想说的关于 weightx,y 的内容,我知道,但重点是我想做一个 Yamb 游戏。所以我希望我的单元格小到 xxx 数字大小。它也不是大约 30,400 的类型,因为我想制作一个看起来像一列的面板,以便我可以在其中放置一列 15 个数字。但我现在改变了它,因为它是不必要的。我的底线问题是如何将标签(例如“56”或“tralala”)放入它自己的单元格的中间。它们都卡在左侧(中间,关于 y)。
  • @user1830241 :你必须使用这个JLabel lab = new JLabel("proba", JLabel.CENTER);。正如 "GuidoSimone" 所指出的,似乎仅此一项就对您有用。