杰瑞科技汇

Java Swing文字如何居中显示?

核心思想

Swing 中的组件(如 JLabel, JButton)通常有自己的“对齐”属性,而布局管理器(如 FlowLayout, BorderLayout, GridBagLayout)则负责决定组件在容器中的位置。

  • 组件内部居中:控制组件内部(如按钮上的文字、标签内的文本)的对齐方式。
  • 组件外部居中:控制组件本身在其父容器中的位置。

在单个组件内部居中 (如 JLabel, JButton)

这是最简单的情况,主要使用组件自带的 setHorizontalAlignment 方法。

a. 使用 JLabel

JLabel 有一个专门的 setHorizontalAlignment 方法。

import javax.swing.*;
public class LabelCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("JLabel 居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setLayout(new FlowLayout()); // 使用 FlowLayout 作为示例
            JLabel label = new JLabel("这是一个标签");
            // 设置文本在 JLabel 内部水平居中
            // SwingConstants.CENTER 是一个静态常量,值为 0
            label.setHorizontalAlignment(SwingConstants.CENTER);
            frame.add(label);
            frame.setLocationRelativeTo(null); // 窗口居中显示
            frame.setVisible(true);
        });
    }
}

常用对齐方式:

  • SwingConstants.LEFT (默认值)
  • SwingConstants.CENTER
  • SwingConstants.RIGHT
  • SwingConstants.LEADING (与文本方向一致,从左到右语言中等同于 LEFT)
  • SwingConstants.TRAILING (与文本方向相反,从左到右语言中等同于 RIGHT)

b. 使用 JButton

JButton 继承自 AbstractButton,同样使用 setHorizontalAlignment 方法。

import javax.swing.*;
public class ButtonCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("JButton 居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);
            frame.setLayout(new FlowLayout());
            JButton button = new JButton("点击我");
            // 设置文本在 JButton 内部水平居中
            button.setHorizontalAlignment(SwingConstants.CENTER);
            frame.add(button);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

c. 同时水平和垂直居中

对于 JLabelJButton,它们没有直接的 setVerticalAlignment 方法,要实现垂直居中,通常需要配合布局管理器。

使用 JPanel + GridBagLayout (最灵活)

GridBagLayout 是最强大的布局管理器,可以精确控制组件在网格中的位置和对齐方式。

import javax.swing.*;
import java.awt.*;
public class VerticalCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("垂直居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            // 创建一个主面板,使用 GridBagLayout
            JPanel mainPanel = new JPanel(new GridBagLayout());
            // 创建一个标签
            JLabel label = new JLabel("我在水平和垂直方向都居中了");
            label.setHorizontalAlignment(SwingConstants.CENTER); // 水平居中
            // 设置 GridBagConstraints
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0; // 第0列
            gbc.gridy = 0; // 第0行
            gbc.insets = new Insets(10, 10, 10, 10); // 设置组件与边界的间距
            // 关键:设置组件在网格单元格内的对齐方式
            gbc.anchor = GridBagConstraints.CENTER; // 在单元格内居中
            mainPanel.add(label, gbc);
            frame.add(mainPanel);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

GridBagConstraints.anchor 常用值:

  • GridBagConstraints.CENTER (默认值,水平和垂直都居中)
  • GridBagConstraints.NORTH (顶部)
  • GridBagConstraints.SOUTH (底部)
  • GridBagConstraints.WEST (左侧)
  • GridBagConstraints.EAST (右侧)
  • GridBagConstraints.NORTHWEST (左上) 等。

在容器中居中组件

这是将一个组件(如 JPanel, JButton)放置在其父窗口或面板的正中央。

a. 使用 BorderLayout

BorderLayout 是最简单的方法,它有五个区域:NORTH, SOUTH, EAST, WEST, CENTER,将组件添加到 CENTER 区域,它会自动水平和垂直居中填充该区域。

import javax.swing.*;
public class BorderLayoutCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("BorderLayout 居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            // 默认布局就是 BorderLayout
            // frame.setLayout(new BorderLayout());
            // 创建一个面板,让它居中
            JPanel centerPanel = new JPanel();
            centerPanel.setBackground(Color.LIGHT_GRAY);
            centerPanel.add(new JLabel("这个面板在窗口中央"));
            // 将面板添加到窗口的 CENTER 区域
            frame.add(centerPanel, BorderLayout.CENTER);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

注意BorderLayout.CENTER 的组件会拉伸以填充整个可用空间,这通常不是我们想要的,我们通常希望居中一个固定大小的组件。

b. 使用 GridBagLayout (推荐)

这是最推荐和最灵活的方法,无论父容器大小如何变化,组件都能保持居中。

import javax.swing.*;
import java.awt.*;
public class GridBagCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("GridBagLayout 居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            frame.setLayout(new GridBagLayout()); // 设置窗口的布局为 GridBagLayout
            JButton centerButton = new JButton("我居中了");
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            // 关键:设置组件在网格单元格内的对齐方式
            gbc.anchor = GridBagConstraints.CENTER;
            frame.add(centerButton, gbc);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

c. 使用 BoxLayout

BoxLayout 可以让组件在垂直或水平方向上居中。

import javax.swing.*;
import java.awt.*;
public class BoxLayoutCenterExample {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("BoxLayout 居中示例");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(400, 300);
            // 创建一个垂直方向的 BoxLayout 面板
            JPanel boxPanel = new JPanel();
            boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
            // 添加一个弹簧来将组件推到中间
            boxPanel.add(Box.createVerticalGlue());
            JButton centerButton = new JButton("我垂直居中了");
            boxPanel.add(centerButton);
            // 再添加一个弹簧
            boxPanel.add(Box.createVerticalGlue());
            frame.add(boxPanel);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

Box.createVerticalGlue() 会创建一个具有弹性大小的组件,它会将前后的组件推到面板的两端,从而达到垂直居中的效果,水平居中同理,使用 BoxLayout.X_AXISBox.createHorizontalGlue()


总结与最佳实践

场景 推荐方法 代码示例
文本在 JLabel/JButton 内部水平居中 component.setHorizontalAlignment(SwingConstants.CENTER); label.setHorizontalAlignment(SwingConstants.CENTER);
组件在容器中水平和垂直居中 GridBagLayout panel.setLayout(new GridBagLayout());
gbc.anchor = GridBagConstraints.CENTER;
快速将组件填充整个容器 BorderLayout frame.add(myComponent, BorderLayout.CENTER);
在垂直或水平方向上居中一排组件 BoxLayout + Glue panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(Box.createVerticalGlue());

核心要点:

  1. 组件内部:用 setHorizontalAlignment
  2. 组件外部:用 GridBagLayoutGridBagConstraints.CENTER 是最通用和强大的解决方案。
  3. 组合使用:通常需要将两者结合,一个 JPanel 内部有 JLabel,你希望 JPanel 在窗口中居中,JLabelJPanel 中也居中。
// 综合示例:面板居中,面板内的标签也居中
JFrame frame = new JFrame("综合居中示例");
frame.setLayout(new GridBagLayout()); // 1. 使用 GridBagLayout 让面板居中
JPanel innerPanel = new JPanel();
innerPanel.setBackground(Color.ORANGE);
JLabel label = new JLabel("面板和文本都居中了");
label.setHorizontalAlignment(SwingConstants.CENTER); // 2. 标签文本在面板内水平居中
innerPanel.add(label);
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.CENTER; // 3. 面板在窗口中居中
frame.add(innerPanel, gbc);
分享:
扫描分享到社交APP
上一篇
下一篇