Java GUI温度计算器故障:JLabel5无法正常显示转换结果
修复你的GUI温度转换器问题
嘿,我看了你的代码,确实找到了几个关键问题,咱们一步步来修复:
问题梳理
- 变量遮蔽问题:在
actionPerformed方法里,你重新定义了和类成员变量同名的label5(String类型)和word1(double类型),这直接覆盖了原本的JLabel和JTextField对象,导致你无法调用setText()这类组件方法。 - 公式运算符错误:温度转换里误用了取余运算符
%,正确的应该是除法运算符/,取余是求两个数相除的余数,不是用来做转换计算的。 - 结果赋值逻辑混乱:你把计算结果和setText的参数搞反了,应该先算出正确的转换值,再把这个值设置到label5上。
修复后的完整代码
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class GUI implements ActionListener{ JFrame frame; JPanel contentPane; JLabel label1, label2, label3, label4, label5; JTextField word1; JButton Celcius, Fahrenheit; public GUI(){ frame = new JFrame("Temperature Convertor"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Grid layout contentPane = new JPanel(); contentPane.setLayout(new GridLayout(0, 2, 10, 5)); contentPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); contentPane.setBackground(Color.black); label1 = new JLabel("Temperature Convertor"); label1.setAlignmentX(JLabel.CENTER_ALIGNMENT); label1.setBorder(BorderFactory.createEmptyBorder(30,30,30,30)); contentPane.add(label1); label2 = new JLabel(new ImageIcon("image1.jpg")); label2.setAlignmentX(JLabel.CENTER_ALIGNMENT); label2.setBorder(BorderFactory.createEmptyBorder(30,30,30,30)); contentPane.add(label2); label3 = new JLabel("Enter Temperature: "); label3.setAlignmentX(JLabel.CENTER_ALIGNMENT); label3.setBorder(BorderFactory.createEmptyBorder(30,30,30,30)); contentPane.add(label3); word1 = new JTextField(10); contentPane.add(word1); Celcius = new JButton("Celcius"); Celcius.setAlignmentX(JButton.CENTER_ALIGNMENT); Celcius.setActionCommand("Celcius"); Celcius.addActionListener(this); contentPane.add(Celcius); Fahrenheit = new JButton("Fahrenheit"); Fahrenheit.setAlignmentX(JButton.CENTER_ALIGNMENT); Fahrenheit.setActionCommand("Fahrenheit"); Fahrenheit.addActionListener(this); contentPane.add(Fahrenheit); label4 = new JLabel("The Coverted Temperature is: "); label4.setAlignmentX(JLabel.CENTER_ALIGNMENT); label4.setBorder(BorderFactory.createEmptyBorder(30,30,30,30)); contentPane.add(label4); label5 = new JLabel(""); label5.setAlignmentX(JLabel.CENTER_ALIGNMENT); label5.setBorder(BorderFactory.createEmptyBorder(30,30,30,30)); contentPane.add(label5); frame.setContentPane(contentPane); frame.pack(); frame.setVisible(true); } public void actionPerformed(ActionEvent event){ String eventName = event.getActionCommand(); // 先获取输入的温度值,注意捕获可能的格式异常 try { double inputTemp = Double.parseDouble(word1.getText()); String result; if (eventName.equals("Celcius")){ // 华氏转摄氏:C = (F - 32) * 5/9 double celsius = (inputTemp - 32) * 5 / 9; result = String.format("%.2f Degree's Celsius", celsius); } else if (eventName.equals("Fahrenheit")){ // 摄氏转华氏:F = C * 9/5 + 32 double fahrenheit = inputTemp * 9 / 5 + 32; result = String.format("%.2f Degree's Fahrenheit", fahrenheit); } else { result = "Invalid operation"; } // 设置结果到label5 label5.setText(result); } catch (NumberFormatException e) { label5.setText("请输入有效的数字!"); } } public static void main(String[] args){ GUI g = new GUI(); } }
额外优化点
- 加了
try-catch来处理用户输入非数字的情况,避免程序崩溃 - 用
String.format()让结果显示更美观(保留两位小数) - 修正了转换公式的注释,让逻辑更清晰
内容的提问来源于stack exchange,提问作者Gin Oakain
相关产品推荐
相关产品推荐

