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

能否从单个JTextField获取两个不同字符串?Java Swing开发问题

问题原因解析
  • 你在ActionListener触发的同一时间点连续两次调用tf.getText(),此时文本框内仍然是第一次输入的内容,两个变量自然会拿到相同值,代码没有等待用户第二次输入就完成了两个变量的赋值操作。
  • 你将workHours和hourlyIncome定义为ActionListener内部的局部变量,方法执行完成后变量就会被销毁,无法留存到后续计算使用。
  • 没有添加状态判断逻辑,程序无法区分当前输入属于工时还是时薪,自然无法分别存储两次输入。
修复思路
  1. 给Main类新增3个成员变量:分别存储工时、时薪的变量,以及用来判断当前输入阶段的状态标记
  2. 每次用户回车触发监听时,先根据状态判断当前输入要存到哪个变量里,之后清空输入框、修改提示文字、切换状态
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 09:06:04