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

如何将JTextField输入值存入变量?Swing投注程序金额计算异常解决

Java Swing投注程序问题解决

一、如何将JTextField组件的输入值存入变量?

  • 核心步骤:
    1. 调用getText()方法获取输入框中的字符串内容;
    2. 根据业务需求将字符串转换为对应数据类型(如整数用Integer.parseInt(),浮点数用Double.parseDouble());
    3. 捕获NumberFormatException,处理用户输入非数字的异常场景。
  • 示例代码:
// 获取投注金额输入
String inputStr = TEXT1.getText().trim();
int betAmount = 0;
try {
    betAmount = Integer.parseInt(inputStr);
} catch (NumberFormatException ex) {
    // 提示用户输入有效数字
    JOptionPane.showMessageDialog(null, "请输入合法的数字");
    return;
}

二、投注程序总金额不更新的问题排查与修复

问题根源

  1. 总金额变量作用域错误:每次点击BET按钮时,都在方法内重新初始化int Total = 50,导致总金额无法累计,始终从初始值开始计算;
  2. 变量遮蔽:在initialize()方法中定义了局部变量int TEXT1 = 0,覆盖了类成员变量JTextField TEXT1,后续逻辑使用的是值为0的局部变量,而非用户输入的投注金额;
  3. 业务逻辑错误:错误地将投注金额与随机数比较,实际应比较用户猜测的数字(TEXT4)和随机数;
  4. 冗余无效代码:ActionListener内定义的String TEXT1;属于无效代码,且会进一步遮蔽变量。

修复后的完整代码

package basics;

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.util.Random;

public class NumGenGIUI {
    
    private JFrame frame;
    private JTextField TEXT1; // 投注金额输入框
    private JTextField TEXT2; // 总金额显示框
    private JTextField TEXT3; // 中奖数字显示框
    private JTextField TEXT4; // 用户猜测数字输入框
    private int total = 50; // 类成员变量,保存累计总金额

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    NumGenGIUI window = new NumGenGIUI();
                    window.frame.setVisible(true);
                    // 初始化显示初始总金额
                    window.TEXT2.setText(Integer.toString(window.total));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public NumGenGIUI() {
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.getContentPane().setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 19));
        frame.setBounds(100, 100, 828, 609);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        TEXT1 = new JTextField();
        TEXT1.setBounds(38, 29, 332, 79);
        frame.getContentPane().add(TEXT1);
        TEXT1.setColumns(10);
        TEXT1.setText("输入投注金额");
        
        TEXT4 = new JTextField();
        TEXT4.setColumns(10);
        TEXT4.setBounds(38, 130, 332, 79);
        frame.getContentPane().add(TEXT4);
        TEXT4.setText("输入猜测数字");
        
        JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setBounds(40, 11, 49, 14);
        frame.getContentPane().add(lblNewLabel);
        
        JButton btnBetAgain = new JButton("BET AGAIN");
        btnBetAgain.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                TEXT1.setText("输入投注金额");
                TEXT4.setText("输入猜测数字");
                TEXT3.setText("");
            }
        });
        btnBetAgain.setFont(new Font("Tw Cen MT Condensed Extra Bold", Font.PLAIN, 40));
        btnBetAgain.setBounds(563, 286, 210, 79);
        frame.getContentPane().add(btnBetAgain);
        
        TEXT2 = new JTextField();
        TEXT2.setFont(new Font("Tw Cen MT Condensed Extra Bold", Font.PLAIN, 99));
        TEXT2.setColumns(10);
        TEXT2.setBounds(24, 390, 749, 171);
        TEXT2.setEditable(false); // 总金额显示框设为不可编辑
        frame.getContentPane().add(TEXT2);
        
        TEXT3 = new JTextField();
        TEXT3.setBounds(586, 88, 124, 120);
        TEXT3.setEditable(false); // 中奖数字显示框设为不可编辑
        frame.getContentPane().add(TEXT3);
        TEXT3.setColumns(10);
        
        JLabel lblNewLabel_1 = new JLabel("The winning number is?");
        lblNewLabel_1.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 19));
        lblNewLabel_1.setBounds(532, 40, 249, 49);
        frame.getContentPane().add(lblNewLabel_1);
        
        JLabel lblNewLabel_2 = new JLabel("YOUR TOTAL IS...");
        lblNewLabel_2.setFont(new Font("Tw Cen MT Condensed Extra Bold", Font.BOLD | Font.ITALIC, 18));
        lblNewLabel_2.setBounds(24, 349, 138, 34);
        frame.getContentPane().add(lblNewLabel_2);
        
        JButton btnBET = new JButton("BET");
        btnBET.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 校验并获取投注金额
                int betAmount = 0;
                try {
                    betAmount = Integer.parseInt(TEXT1.getText().trim());
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(frame, "请输入有效的投注金额");
                    return;
                }
                if (betAmount <= 0 || betAmount > total) {
                    JOptionPane.showMessageDialog(frame, "投注金额需大于0且不超过当前总金额");
                    return;
                }
                
                // 校验并获取用户猜测数字
                int userGuess = 0;
                try {
                    userGuess = Integer.parseInt(TEXT4.getText().trim());
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(frame, "请输入有效的猜测数字");
                    return;
                }
                
                // 生成1-30的随机中奖数字
                Random randomnum = new Random();
                int winningNumber = 1 + randomnum.nextInt(30);
                TEXT3.setText(Integer.toString(winningNumber));
                
                // 更新总金额
                if (userGuess == winningNumber) {
                    total += betAmount * 2; // 猜中则投注额翻倍加入总金额
                } else {
                    total -= betAmount; // 未猜中则扣除投注额
                }
                
                // 更新总金额显示
                TEXT2.setText(Integer.toString(total));
            }
        });
        btnBET.setFont(new Font("Tw Cen MT Condensed Extra Bold", Font.PLAIN, 40));
        btnBET.setBounds(404, 29, 93, 177);
        frame.getContentPane().add(btnBET);
    }
}

修复说明

  1. 将total设为类成员变量,确保每次投注后能累计更新总金额;
  2. 移除遮蔽类成员变量的局部变量,正确获取用户输入的投注金额和猜测数字;
  3. 修正业务逻辑:比较用户猜测数字与随机中奖数字,而非投注金额;
  4. 添加输入合法性校验,处理非数字输入、投注金额超出总金额等异常场景;
  5. 将总金额、中奖数字的显示框设为不可编辑,避免用户手动修改;
  6. 优化用户提示文本,提升交互体验。

内容的提问来源于stack exchange,提问作者Ryan Guard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:20:25