将jlabel集中在jpanel上

dwbf0jvd  于 2021-08-25  发布在  Java
关注(0)|答案(5)|浏览(430)

我正在使用netbeans gui builder来处理我的布局(我对LayoutManager很糟糕),并尝试放置一个简单的jlabel,以便它始终位于其父jpanel的中心(水平)。理想情况下,即使调整了jpanel的大小,这也会保持为真,但是如果这是一个疯狂的编码量,那么在jpanel第一次创建时,仅仅居中就足够了。
我自己尝试处理布局已经够糟糕的了,但是由于netbeans gui builder自动生成不可变的代码,我不可能弄清楚如何进行居中,而且我还无法在网上找到任何帮助我的东西。
感谢所有能指引我正确方向的人!

klh5stk1

klh5stk11#

mara:“感谢您的回复,但是netbeans gui构建使用grouplayout,这是不可重写的。”
不是真的!右键单击netbeans gui builder中jframe(或任何其他gui容器)内的任意位置,然后选择“设置布局”。默认情况下,选择“自由设计”,这是组布局,但您可以选择任何其他布局,包括mkorbel建议的边框布局。

brtdzjyr

brtdzjyr2#

根据您使用的布局管理器的不同,有很多方法可以做到这一点。我建议您阅读容器教程中的布局组件。
我相信无论布局管理器如何,以下内容都会起作用: JLabel.setHorizontalAlignment(SwingConstants.CENTER)

hyrbngr7

hyrbngr73#

通过使用borderlayout,可以将任何jcomponents放置到中心区域。例如,请参阅堆栈溢出问题的答案摆脱JPanel之间的间隙。这应该行得通。

w1jd8yoj

w1jd8yoj4#

以下是使零部件居中的四种方法:

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);
            }
        });
    }
}
kognpnkq

kognpnkq5#

即使使用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());

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

相关问题