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

Java Swing单位转换程序:单选按钮关联JComboBox切换选项

Java Swing单位转换程序:单选按钮切换下拉框选项

我正在用Java Swing开发一款单位转换程序,支持质量、长度、体积转换。想要实现点击对应单选按钮(“masse”“mesure”“volume”)时,下拉框(JComboBox)的选项切换为对应单位集合:

  • 质量:g、kg、t
  • 长度:cm、m、km
  • 体积:cl、dl、l

以下是我的代码片段:

JRadioButton r1 = new JRadioButton("masse");
r1.setBounds(34, 43, 109, 23);
f.add(r1);

JRadioButton r2 = new JRadioButton("mesure");
r2.setBounds(34, 69, 109, 23);
f.add(r2);

JRadioButton r3 = new JRadioButton("volume");
r3.setBounds(34, 94, 109, 23);
f.add(r3);
ButtonGroup bg=new ButtonGroup();
bg.add(r1);bg.add(r2);bg.add(r3);
f.setLayout(null); 
final JComboBox list2 = new JComboBox();
list2.setModel(new DefaultComboBoxModel(new String[] {"choisir ", "kg", "g", "t"}));
list2.setBounds(193, 172, 64, 22);
f.add(list2);
final JComboBox list2 = new JComboBox();
list2.setModel(new DefaultComboBoxModel(new String[] {"choisir ", "cm", "m", "km"}));
list2.setBounds(193, 172, 64, 22);
f.add(list2);
final JComboBox list2 = new JComboBox();
list2.setModel(new DefaultComboBoxModel(new String[] {"choisir ", "cl", "dl", "l"}));
list2.setBounds(193, 172, 64, 22);
f.add(list2);

界面示意图


问题分析

你的代码存在**重复定义同一个JComboBox变量list2**的问题,编译时会直接报错;即使忽略编译问题,最终界面也只会显示最后一个创建的下拉框,且没有给单选按钮添加事件逻辑来切换选项集合。

修正后的实现方案

只需要保留一个JComboBox实例,给每个单选按钮绑定事件监听器,动态切换下拉框的选项模型即可:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class UnitConverter {
    public static void main(String[] args) {
        JFrame f = new JFrame("单位转换");
        f.setSize(400, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(null);

        // 初始化单选按钮
        JRadioButton r1 = new JRadioButton("masse");
        r1.setBounds(34, 43, 109, 23);
        f.add(r1);

        JRadioButton r2 = new JRadioButton("mesure");
        r2.setBounds(34, 69, 109, 23);
        f.add(r2);

        JRadioButton r3 = new JRadioButton("volume");
        r3.setBounds(34, 94, 109, 23);
        f.add(r3);

        // 单选按钮分组
        ButtonGroup bg = new ButtonGroup();
        bg.add(r1);
        bg.add(r2);
        bg.add(r3);

        // 创建单个下拉框
        JComboBox<String> unitBox = new JComboBox<>();
        unitBox.setBounds(193, 172, 64, 22);
        f.add(unitBox);

        // 统一的单选按钮事件监听器
        ActionListener switchUnitListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JRadioButton selectedBtn = (JRadioButton) e.getSource();
                DefaultComboBoxModel<String> model;
                
                switch (selectedBtn.getText()) {
                    case "masse":
                        model = new DefaultComboBoxModel<>(new String[]{"choisir ", "g", "kg", "t"});
                        break;
                    case "mesure":
                        model = new DefaultComboBoxModel<>(new String[]{"choisir ", "cm", "m", "km"});
                        break;
                    case "volume":
                        model = new DefaultComboBoxModel<>(new String[]{"choisir ", "cl", "dl", "l"});
                        break;
                    default:
                        model = new DefaultComboBoxModel<>(new String[]{"choisir "});
                }
                unitBox.setModel(model);
            }
        };

        // 给所有单选按钮绑定监听器
        r1.addActionListener(switchUnitListener);
        r2.addActionListener(switchUnitListener);
        r3.addActionListener(switchUnitListener);

        // 默认选中质量单选按钮并初始化下拉框
        r1.setSelected(true);
        unitBox.setModel(new DefaultComboBoxModel<>(new String[]{"choisir ", "g", "kg", "t"}));

        f.setVisible(true);
    }
}

核心改进点

  • 仅创建一个JComboBox实例,避免重复定义变量导致的编译错误或界面异常
  • 使用统一的ActionListener处理所有单选按钮的点击事件,通过按钮文本判断切换对应单位模型
  • 设置默认选中状态,保证界面初始化时显示正确的单位选项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:56:23