如何将JTextField输入值存入变量?Swing投注程序金额计算异常解决
Java Swing投注程序问题解决
一、如何将JTextField组件的输入值存入变量?
- 核心步骤:
- 调用
getText()方法获取输入框中的字符串内容; - 根据业务需求将字符串转换为对应数据类型(如整数用
Integer.parseInt(),浮点数用Double.parseDouble()); - 捕获
NumberFormatException,处理用户输入非数字的异常场景。
- 调用
- 示例代码:
// 获取投注金额输入 String inputStr = TEXT1.getText().trim(); int betAmount = 0; try { betAmount = Integer.parseInt(inputStr); } catch (NumberFormatException ex) { // 提示用户输入有效数字 JOptionPane.showMessageDialog(null, "请输入合法的数字"); return; }
二、投注程序总金额不更新的问题排查与修复
问题根源
- 总金额变量作用域错误:每次点击BET按钮时,都在方法内重新初始化
int Total = 50,导致总金额无法累计,始终从初始值开始计算; - 变量遮蔽:在
initialize()方法中定义了局部变量int TEXT1 = 0,覆盖了类成员变量JTextField TEXT1,后续逻辑使用的是值为0的局部变量,而非用户输入的投注金额; - 业务逻辑错误:错误地将投注金额与随机数比较,实际应比较用户猜测的数字(TEXT4)和随机数;
- 冗余无效代码: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); } }
修复说明
- 将
total设为类成员变量,确保每次投注后能累计更新总金额; - 移除遮蔽类成员变量的局部变量,正确获取用户输入的投注金额和猜测数字;
- 修正业务逻辑:比较用户猜测数字与随机中奖数字,而非投注金额;
- 添加输入合法性校验,处理非数字输入、投注金额超出总金额等异常场景;
- 将总金额、中奖数字的显示框设为不可编辑,避免用户手动修改;
- 优化用户提示文本,提升交互体验。
内容的提问来源于stack exchange,提问作者Ryan Guard
相关产品推荐
相关产品推荐

