能否从单个JTextField获取两个不同字符串?Java Swing开发问题
问题原因解析
- 你在ActionListener触发的同一时间点连续两次调用
tf.getText(),此时文本框内仍然是第一次输入的内容,两个变量自然会拿到相同值,代码没有等待用户第二次输入就完成了两个变量的赋值操作。 - 你将
workHours和hourlyIncome定义为ActionListener内部的局部变量,方法执行完成后变量就会被销毁,无法留存到后续计算使用。 - 没有添加状态判断逻辑,程序无法区分当前输入属于工时还是时薪,自然无法分别存储两次输入。
修复思路
- 给Main类新增3个成员变量:分别存储工时、时薪的变量,以及用来判断当前输入阶段的状态标记
- 每次用户回车触发监听时,先根据状态判断当前输入要存到哪个变量里,之后清空输入框、修改提示文字、切换状态
- 两次输入收集完成后,直接计算年收入并展示结果,同时增加基础的输入校验逻辑避免崩溃
完整修改代码
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Main extends JFrame { JPanel panel; JLabel lbl; JTextField tf; // 新增成员变量,存储两次输入的值 private String workHours; private String hourlyIncome; // 状态标记:false=当前收集每日工时,true=当前收集时薪 private boolean isCollectingHourlyIncome = false; public Main() { panel = new JPanel(null); lbl = new JLabel(); tf = new JTextField(); setTitle("Yearly Income Calculator"); setSize(500, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); lbl.setText("How many hours a day do you work?"); tf.setBounds(25, 65, 135, 20); lbl.setBounds(230, 0, 216, 148); panel.add(tf); panel.add(lbl); add(panel); setVisible(true); tf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String input = tf.getText().trim(); // 基础非空校验 if (input.isEmpty()) { JOptionPane.showMessageDialog(panel, "请输入有效内容"); return; } if (!isCollectingHourlyIncome) { // 第一步:存储每日工时 workHours = input; lbl.setText("How much is your hourly income?"); // 清空输入框方便下一次输入 tf.setText(""); // 切换到收集时薪的状态 isCollectingHourlyIncome = true; } else { // 第二步:存储时薪,计算结果 hourlyIncome = input; try { double hours = Double.parseDouble(workHours); double incomePerHour = Double.parseDouble(hourlyIncome); // 计算逻辑可自定义,这里按全年无休计算,可自行扣除休息日 double yearIncome = hours * incomePerHour * 365; lbl.setText(String.format("预估年收入:%.2f 元", yearIncome)); // 输入完成禁用输入框,也可以加重置按钮重新计算 tf.setEnabled(false); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(panel, "请输入有效的数字"); // 输入错误重置状态,重新开始收集 workHours = null; hourlyIncome = null; isCollectingHourlyIncome = false; lbl.setText("How many hours a day do you work?"); tf.setText(""); tf.setEnabled(true); } } } }); } public static void main(String[] args) { new Main(); } }
内容的提问来源于stack exchange,提问作者Tilt
相关产品推荐
相关产品推荐

