BorderLayout 中的 JLabel 居中,行尾有一个按钮

Center JLabel in BorderLayout with a button at line end

我的 swing 布局的一部分有一个 header,我希望文本在该部分的整个宽度上水平居中,但也只有右侧有一个按钮。它应该是这样的:

 /------Same width------\           /------Same width------\
[------------------------]Text here[----------------[Button]]

我目前使用的是 BorderLayout,文本居中,按钮在行尾,但文本居中而不计算按钮,因此:

 /----Same width----\           /---Same width----\
[--------------------]Text here[-------------------][Button]]

我不确定这是否是您真正想要的答案,但您可以使用不同的布局管理器,例如 GridBagLayout

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class JavaApplication295 {

    public static void main(String[] args) {
        new JavaApplication295();
    }

    public JavaApplication295() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
//          gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1;

            add(new JLabel("Look ma, no hands"), gbc);

            gbc.anchor = GridBagConstraints.EAST;
            add(new JButton("No Allowance"), gbc);
        }

    }


}

现在,问题在于,这两个组件实际上位于同一位置,不同之处在于,按钮锚定在单元格的正确位置,这意味着在计算布局时,它们会重叠....

这是一种使用 OverlayLayout 的方法,它被设计为在 z 轴上绘制多个组件:

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

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        JLabel label = new JLabel("I'm a Centered Label");
        Box labelBox= Box.createHorizontalBox();
        labelBox.add(Box.createHorizontalGlue());
        labelBox.add(label);
        labelBox.add(Box.createHorizontalGlue());

        JButton button = new JButton("Button");
        Box buttonBox= Box.createHorizontalBox();
        buttonBox.add(Box.createHorizontalGlue());
        buttonBox.add(button);

        setLayout( new OverlayLayout(this) );
        add(buttonBox);
        add(labelBox);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE(), BorderLayout.NORTH);
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

随着宽度减小,按钮将覆盖标签。