Java编写公里英里互转Swing程序点击转换无输出问题排查
问题排查与修复方案
核心问题
你猜测的问题方向完全正确,同时还有两个额外问题需要修正:
- 事件监听器注册位置错误:
button.addActionListener(this)写在了actionPerformed方法内部。actionPerformed是监听器触发后才会执行的回调方法,你从未给按钮注册过监听器的前提下,这个方法永远不会被调用,监听器自然也永远不会被注册,点击按钮没有任何反应。 - 缺少公里转英里的分支逻辑,当前只实现了半段转换流程。
- 原有转换系数写反:英里转公里的系数应为1.609左右,0.62是公里转英里的系数。
修复步骤
- 将
button.addActionListener(this)从actionPerformed方法中移到构造方法Converter()里,在界面初始化完成后就给按钮绑定监听器 - 补充
cb2选中状态下的公里转英里计算逻辑 - 修正转换系数,补充单位输出说明
- 增加窗口关闭后自动退出程序的配置,避免进程残留
修正后的完整代码
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Converter extends JFrame implements ActionListener { JLabel label = new JLabel("Distance : "); JTextField input = new JTextField(10); JButton button = new JButton("Convert"); JTextArea output = new JTextArea(10,15); CheckboxGroup cbg = new CheckboxGroup(); Checkbox cb1 = new Checkbox("Convert MILES to KM", cbg, true); Checkbox cb2 = new Checkbox("Convert KM to MILES", cbg, false); public static void main(String args[]){ Converter s = new Converter(); s.setVisible(true); } public Converter(){ setLayout(null); setSize(300,400); // 配置窗口关闭后退出程序 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //left-down-width-height cb1.setBounds(60,30,150,30); cb2.setBounds(60,60,150,30); label.setBounds(30,90,120,30); input.setBounds(90,95,170,20); button.setBounds(100,130,90,30); output.setBounds(45,168,200,165); add(cb1); add(cb2); add(label); add(input); add(button); add(output); // 初始化阶段就给按钮注册监听器 button.addActionListener(this); } public void actionPerformed(ActionEvent e){ if (e.getSource() == button ){ double inputVal = Double.parseDouble(input.getText()); double result; if (cb1.getState() ) { // 英里转公里:1英里≈1.60934公里 result = inputVal * 1.60934; output.setText(inputVal + " 英里 = " + String.format("%.2f", result) + " 公里"); } else { // 公里转英里:1公里≈0.621371英里 result = inputVal * 0.621371; output.setText(inputVal + " 公里 = " + String.format("%.2f", result) + " 英里"); } } } }
内容的提问来源于stack exchange,提问作者Vishnudas V
相关产品推荐
相关产品推荐

