You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swing JPanel布局异常:如何调整组件排列与间距?

如何调整Swing代码让界面匹配预期布局?

我已经设置了JPanel组件,但运行后组件位置不符合目标效果:目标界面是顶部显示标题文本,接着依次是字体选择下拉框、字号单选按钮组、样式复选框组,且组件间有合理间距;但当前界面组件顺序混乱,且没有任何间距。

我的代码如下:

package Lab5;

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

public class FontDesigner extends JFrame {
    public FontDesigner() {
        // JFrame
        setSize(400, 400);
        setTitle("Font Changer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // String
        JLabel text = new JLabel("Change Me");
        text.setFont(new Font("Arial", 1, 28));

        // Radio Button
        JRadioButton button1 = new JRadioButton("Small");
        JRadioButton button2 = new JRadioButton("Medium");
        JRadioButton button3 = new JRadioButton("Large");
        ButtonGroup radioGroup = new ButtonGroup();
        radioGroup.add(button1);
        radioGroup.add(button2);
        radioGroup.add(button3);

        /*
         * if (button1.isSelected()) {
         * text.setSize(1);
         * }
         */

        // Combo Box
        JComboBox combo = new JComboBox<>();
        combo.addItem("Serif");
        combo.addItem("Sans-Serif");
        // String selectedFont = (String) combo.getSelectedItem();

        // Check Box
        JCheckBox checkBox1 = new JCheckBox("Italic");
        JCheckBox checkBox2 = new JCheckBox("Bold");
        ButtonGroup checkBoxGroup = new ButtonGroup();
        checkBoxGroup.add(checkBox1);
        checkBoxGroup.add(checkBox2);

        // JPanel
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        JPanel panel4 = new JPanel();
        panel1.setLayout(new BorderLayout());
        panel2.setLayout(new BorderLayout());
        panel3.setLayout(new BorderLayout());
        panel4.setLayout(new BorderLayout());
        panel1.add(text, BorderLayout.CENTER);
        panel2.add(combo, BorderLayout.CENTER);
        panel3.add(button1, BorderLayout.WEST);
        panel3.add(button2, BorderLayout.CENTER);
        panel3.add(button3, BorderLayout.EAST);
        panel4.add(checkBox1);
        panel4.add(checkBox2);

        // Frame Configuration
        // setLayout(new BorderLayout());
        setLayout(new FlowLayout());
        add(panel1);
        add(panel2);
        add(panel3);
        add(panel4);

        // Set Visibility
        setVisible(true);

    }

    public static void main(String[] args) {
        FontDesigner newFontDesigner = new FontDesigner();
    }
}

调整方案及修改后的代码

核心问题修正点

  • 更换布局管理器:把FlowLayout换成BoxLayout,实现组件垂直堆叠,符合目标界面的上下排列逻辑
  • 修正组件顺序:按照「标题文本 → 字体下拉框 → 字号单选组 → 样式复选框组」的顺序添加组件
  • 添加合理间距:用Box.createVerticalStrut()设置组件间的垂直间距,同时给窗口设置内边距
  • 修复复选框错误:移除复选框的ButtonGroup,因为复选框支持多选,ButtonGroup会强制变成单选模式
  • 优化组件对齐:让所有组件居中对齐,更贴合目标界面的视觉效果

修改后的完整代码

package Lab5;

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

public class FontDesigner extends JFrame {
    public FontDesigner() {
        // JFrame基础配置
        setTitle("Font Changer");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 使用BoxLayout实现垂直布局
        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        // 设置窗口内边距,避免组件贴边
        getContentPane().setBorder(new EmptyBorder(20, 20, 20, 20));

        // 标题文本组件
        JLabel text = new JLabel("Change Me");
        text.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 28));
        // 让文本居中显示
        text.setAlignmentX(Component.CENTER_ALIGNMENT);

        // 字体选择下拉框
        JComboBox<String> combo = new JComboBox<>();
        combo.addItem("Serif");
        combo.addItem("Sans-Serif");
        combo.setAlignmentX(Component.CENTER_ALIGNMENT);
        // 设置下拉框的默认尺寸,避免过宽/过窄
        combo.setPreferredSize(new Dimension(150, 30));

        // 字号单选按钮组
        JRadioButton smallBtn = new JRadioButton("Small");
        JRadioButton mediumBtn = new JRadioButton("Medium");
        JRadioButton largeBtn = new JRadioButton("Large");
        // 默认选中Medium选项
        mediumBtn.setSelected(true);
        ButtonGroup radioGroup = new ButtonGroup();
        radioGroup.add(smallBtn);
        radioGroup.add(mediumBtn);
        radioGroup.add(largeBtn);

        JPanel sizePanel = new JPanel();
        sizePanel.add(smallBtn);
        sizePanel.add(mediumBtn);
        sizePanel.add(largeBtn);
        sizePanel.setAlignmentX(Component.CENTER_ALIGNMENT);

        // 样式复选框组
        JCheckBox italicBox = new JCheckBox("Italic");
        JCheckBox boldBox = new JCheckBox("Bold");
        JPanel stylePanel = new JPanel();
        stylePanel.add(italicBox);
        stylePanel.add(boldBox);
        stylePanel.setAlignmentX(Component.CENTER_ALIGNMENT);

        // 添加组件到窗口,并设置垂直间距
        add(text);
        add(Box.createVerticalStrut(20)); // 文本与下拉框的间距
        add(combo);
        add(Box.createVerticalStrut(15)); // 下拉框与字号面板的间距
        add(sizePanel);
        add(Box.createVerticalStrut(15)); // 字号面板与样式面板的间距
        add(stylePanel);

        // 让窗口自适应组件大小,替代固定setSize
        pack();
        // 窗口居中显示
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        // 在Swing事件调度线程中启动界面,保证线程安全
        SwingUtilities.invokeLater(() -> new FontDesigner());
    }
}

内容的提问来源于stack exchange,提问作者Montaj Kurgu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:15:11