Java:如何在JPanel中垂直对齐元素

21

我试图在一个JPanel中垂直居中对齐(居中显示)两个JLabel。

JPanel panel = new JPanel();
panel.setPreferredSize(size);
JLabel label1 = new JLabel(icon);
JLabel label2 = new JLabel("text");
panel.add(label1);
panel.add(label2);

我尝试使用setAlignmentY()但没有成功。两个标签始终都出现在JPanel的顶部。

更新:标签应该像使用FlowLayout一样相邻,但位于JPanel中间。


1
我建议使用WindowBuilder - Kai
1
请务必学习和理解LayoutManagers的概念(请参阅Swing标签中引用的教程中的相应章节)-它们负责每个方面的布局。任务是找到支持您要求的管理器。顺便说一句:永远不要使用setXXSize,原因请参见https://dev59.com/BGw05IYBdhLWcg3weBlF#7229519。 - kleopatra
3个回答

27

使用默认约束条件的GridBagLayout。以下是一个小型演示代码:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestVerticalAlignement {

    protected void initUI() {
        final JFrame frame = new JFrame();
        frame.setTitle("Test vertical alignement");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        JLabel label1 = new JLabel("label1");
        JLabel label2 = new JLabel("label2");
        panel.add(label1, gbc);
        panel.add(label2, gbc);
        frame.add(panel);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestVerticalAlignement().initUI();
            }
        });
    }

}

1
+1 个好的解决方案。我刚想建议同样的事情,但你打字更快 :) - John Snow
已经编辑了文本中的拼写错误,使其与正确的代码匹配 :-) - kleopatra
@GuillaumePolet 感谢您的快速回答。然而,这不完全是我想要的。我得到了一个标签在另一个标签下面,但我希望label2像在FlowLayout中一样出现在label1旁边,但在JPanel内垂直居中显示。 - Nikolay Kuznetsov
@NikolayKuznetsov 我错了,我误解了其他事情。我已经更新了帖子。 - Guillaume Polet

19

你可以使用这个2013年的答案,作者是Nakul Sudhakar

I used a BoxLayout and set its second parameter as BoxLayout.Y_AXIS and it worked for me:

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

4

使用gridlayout,很简单。 应该可以工作。

看看我的以下示例:

import java.awt.*;
import java.applet.Applet;
import javax.swing.*;


/*
    <applet code=AJ07 width=450 height=450>
    </applet>
*/

    public class AJ07 extends JApplet{
        Container c=null;

        public void init(){

                JPanel pTop=new JPanel();
                JPanel pLeft=new JPanel();
                JPanel pCenter=new JPanel();
                JPanel pProperties=new JPanel();

                pLeft.setLayout(new GridLayout(20,1));

                c=this.getContentPane();
                JButton bNew=new JButton("New");
                pTop.add(bNew);
                JButton bOpen=new JButton("Open");
                pTop.add(bOpen);
                JButton bSave=new JButton("Save");
                pTop.add(bSave);
                JButton bSaveAll=new JButton("Save All");
                pTop.add(bSaveAll);
                JButton bRun=new JButton("Run");
                pTop.add(bRun);
                JButton bStop=new JButton("Stop");
                pTop.add(bStop);
                JButton bPause=new JButton("Pause");
                pTop.add(bPause);

                JButton bText=new JButton("TextBox");
                pLeft.add(bText);
                JButton bButton=new JButton("Button");
                pLeft.add(bButton);

                pProperties.setLayout(new GridLayout(20,1));
                pProperties.add(new Label("BackColor"));
                pProperties.add(new Label("ForeColor"));
                c.add(new TextArea(),BorderLayout.CENTER);

                c.add(pTop,BorderLayout.NORTH);
                c.add(pLeft,BorderLayout.WEST);
                c.add(new Label("Project Loaded Successfully!"),BorderLayout.SOUTH);
                c.add(pProperties,BorderLayout.EAST);
                //c.add(pCenter,BorderLayout.CENTER);
        }
    }

下面是输出结果:

在这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接