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
相关产品推荐
相关产品推荐

