Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java布局管理器垂直中心_Java_Swing_Layout - Fatal编程技术网

Java布局管理器垂直中心

Java布局管理器垂直中心,java,swing,layout,Java,Swing,Layout,我有一个面板,它使用组布局来组织一些标签。我想在重新调整尺寸时保持此面板在屏幕中央。如果我使用flow布局将面板放在另一个面板中,我可以保持标签水平居中,但不能垂直居中。哪种布局管理器允许我将面板集中在屏幕中间? 我还尝试了边框布局并将其放置在中间,但它会根据窗口大小调整大小。尝试使用边框布局并添加带有空对象的面板。 例如: public static void main(String[] args) { JFrame frame = new JFrame(); frame.se

我有一个面板,它使用组布局来组织一些标签。我想在重新调整尺寸时保持此面板在屏幕中央。如果我使用flow布局将面板放在另一个面板中,我可以保持标签水平居中,但不能垂直居中。哪种布局管理器允许我将面板集中在屏幕中间?

我还尝试了边框布局并将其放置在中间,但它会根据窗口大小调整大小。

尝试使用边框布局并添加带有空对象的面板。
例如:

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很难失败。