将JLabel置于JPanel上

IAm*_*aja 14 java layout swing netbeans jlabel

我正在使用NetBeans GUI构建器来处理我的布局(我对LayoutManagers很糟糕)并且我正在尝试放置一个简单的JLabel,以便它始终在其父JPanel中居中(水平).理想情况下,即使JPanel被调整大小,这也会保持正确,但是如果这是一个疯狂的编码量,那么在首次创建JPanel时就足以使其居中.

我自己很难尝试处理布局,但由于NetBeans GUI Builder自动生成不可变代码,因此我无法弄清楚如何进行这种中心化,而且我无法在网上找到任何帮助我的东西.

感谢任何能引导我朝正确方向前进的人!

And*_*son 27

以下是将组件置于中心的四种方法:

4中心组件

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

class CenterComponent {

    public static JLabel getLabel(String text) {
        return getLabel(text, SwingConstants.LEFT);
    }

    public static JLabel getLabel(String text, int alignment) {
        JLabel l = new JLabel(text, alignment);
        l.setBorder(new LineBorder(Color.RED, 2));
        return l;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = new JPanel(new GridLayout(2,2,4,4));
                p.setBackground(Color.black);
                p.setBorder(new EmptyBorder(4,4,4,4));

                JPanel border = new JPanel(new BorderLayout());
                border.add(getLabel(
                    "Border", SwingConstants.CENTER), BorderLayout.CENTER);
                p.add(border);

                JPanel gridbag = new JPanel(new GridBagLayout());
                gridbag.add(getLabel("GridBag"));
                p.add(gridbag);

                JPanel grid = new JPanel(new GridLayout());
                grid.add(getLabel("Grid", SwingConstants.CENTER));
                p.add(grid);

                // from @0verbose
                JPanel box = new JPanel();
                box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS ));

                box.add(Box.createHorizontalGlue());
                box.add(getLabel("Box"));
                box.add(Box.createHorizontalGlue());
                p.add(box);

                JFrame f = new JFrame("Streeeetch me..");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


mKo*_*bel 12

通过使用Borderlayout,您可以将任何JComponents放入CENTER区域.例如,请参阅Stack Overflow问题的答案摆脱JPanels之间的差距.这应该工作.

  • "NetBeans GUI Builder使用`GroupLayout`",但您可以从检查器中选择另一个. (3认同)

Hei*_*bug 10

即使使用BoxLayout,您也可以实现:

JPanel listPane = new JPanel();
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS ));

JLabel label = new JLabel();
listPane.add(Box.createHorizontalGlue());
listPane.add(label);
listPane.add(Box.createHorizontalGlue());
Run Code Online (Sandbox Code Playgroud)

mKorbel的解决方案非常适合您的目标.无论如何,我总是喜欢建议BoxLayout,因为它非常灵活.

  • *"我被GroupLayout困住了"*只是因为你不知道如何使用Netbeans.我没有使用它,但我看到Netbeans用户的代码(即使使用GUI设计器)使用了所有标准布局. (2认同)

jir*_*kas 6

Mara:"感谢您的回复,但是NetBeans GUI Build使用了GroupLayout,而且这是不可覆盖的."

不对!右键单击NetBeans GUI构建器中JFrame(或任何其他GUI容器)内的任意位置,然后选择"设置布局".默认情况下选择"自由设计",即组布局,但您可以选择任何其他布局,包括mKo​​rbel建议的边框布局.


mre*_*mre 5

有很多方法可以执行此操作,具体取决于您使用的布局管理器.我建议你阅读容器中Laying Out Components教程.

无论布局管理器如何,我相信以下内容都可行:

JLabel.setHorizontalAlignment(SwingConstants.CENTER)