【发布时间】:2010-10-28 05:30:20
【问题描述】:
我的面板使用组布局来组织一些标签。我想在调整大小时将此面板保持在屏幕中心。如果我使用流布局将面板放在另一个面板中,我可以使标签水平居中但不能垂直居中。哪个布局管理器允许我将面板保持在屏幕中间?
我也尝试了边框布局并将其放置在中心,但它会调整为窗口大小。
【问题讨论】:
我的面板使用组布局来组织一些标签。我想在调整大小时将此面板保持在屏幕中心。如果我使用流布局将面板放在另一个面板中,我可以使标签水平居中但不能垂直居中。哪个布局管理器允许我将面板保持在屏幕中间?
我也尝试了边框布局并将其放置在中心,但它会调整为窗口大小。
【问题讨论】:
首先,我要提一下,请阅读我关于布局的文章:http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/。它很旧但很有帮助(不幸的是,这篇文章早于 BoxLayout。当我在 JavaOne 上发表演讲时,我有一些幻灯片,其中包括 http://javadude.com/articles/javaone 的 BoxLayout)
试试 BoxLayout:
Box verticalBox = Box.createVerticalBox();
verticalBox.add(Box.createVerticalGlue());
verticalBox.add(stuffToCenterVertically);
verticalBox.add(Box.createVerticalGlue());
如果你想将这些东西居中,使用 HorizontalBox 作为 stuffToCenterVertically:
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(stuffToCenter);
horizontalBox.add(Box.createHorizontalGlue());
在代码中“看到”比 gridbag 更容易
【讨论】:
面板本身的GroupLayout,GroupLayout.Alignment.CENTER,用于垂直和水平,setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) 将面板设置为不调整大小。
为了安全起见,您也可以在面板上设置 setMinimumSize 和 setMaximum size。
如果您觉得很时髦,您可以只使用一个 GroupLayout 来处理整个事情,方法是仔细选择并行/顺序组并对标签进行适当的分组。
【讨论】:
您可以构建自己的 LayoutManager 以使单个组件(两个轴或一个轴)居中。这是在两个轴上都执行此操作的一个,您可以轻松地将其更改为垂直或水平居中。
当前实现布局第一个可见子,你也可以改变它...
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;
}
}
}
}
}
【讨论】:
preferredLayoutSize 中得到了堆栈溢出(哈哈)。
尝试使用GridBagLayout 并添加带有空GridBagConstrants 对象的面板。
例如:
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);
}
【讨论】: