JFrame彩票程序信用值无法持久化问题及变量作用域咨询
解决方案
问题根源
每次点击Start按钮时,代码里的int credit = 500;都会重新执行,导致信用值被强制重置为初始值。必须把credit变量的声明移到ActionListener外部,同时保证内部类能访问并修改它。
具体修改步骤
调整变量作用域:在
main方法中、startButton.addActionListener代码之前,用数组包装信用值变量(Java匿名内部类可访问final引用类型变量并修改其内部值):final int[] credit = {500};也可以把
credit定义为类的静态成员变量,让内部类直接访问:public class lotto { private static int credit = 500; public static void main(String[]args) { // 原有代码 } }修改ActionListener内的代码:移除内部的
int credit = 500;,把所有credit的直接引用改为数组元素引用(数组方案),比如:credit = credit + 500;→credit[0] += 500;- 最后更新标签文本时用
ghLabel.setText("Credit: " + credit[0]);
修复代码bug:原代码中
int num3 = Integer.parseInt(num2Field.getText());错误,应读取num3Field的内容:int num3 = Integer.parseInt(num3Field.getText());
修改后的完整代码
package jframe; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; public class lotto { public static void main(String[]args) { Random randI = new Random(); final int[] credit = {500}; // 移到外部并用数组包装 JFrame frame = new JFrame("Lotto"); frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(null); JTextField num1Field = new JTextField(); num1Field.setBounds(80, 10, 100, 30); frame.add(num1Field); JTextField num2Field = new JTextField(); num2Field.setBounds(80, 50, 100, 30); frame.add(num2Field); JTextField num3Field = new JTextField(); num3Field.setBounds(80, 90, 100, 30); frame.add(num3Field); JLabel num1Label = new JLabel("Zahl 1: "); num1Label.setBounds(20, 10, 50, 30); frame.add(num1Label); JLabel num2Label = new JLabel("Zahl 2: "); num2Label.setBounds(20, 50, 50, 30); frame.add(num2Label); JLabel num3Label = new JLabel("Zahl 3: "); num3Label.setBounds(20, 90, 50, 30); frame.add(num3Label); JButton startButton = new JButton("Start!"); startButton.setBounds(30, 150, 80, 30); frame.add(startButton); JButton resetButton = new JButton("Reset"); resetButton.setBounds(120, 150, 80, 30); frame.add(resetButton); JLabel ergLabel = new JLabel(); ergLabel.setBounds(10, 200, 400, 30); frame.add(ergLabel); JLabel ghLabel = new JLabel("500"); ghLabel.setBounds(50, 230, 200, 30); frame.add(ghLabel); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int num1 = Integer.parseInt(num1Field.getText()); int num2 = Integer.parseInt(num2Field.getText()); int num3 = Integer.parseInt(num3Field.getText()); // 修复字段引用错误 System.out.println(credit[0]); int pcnum1 = randI.nextInt(48) + 1; // 简化随机数生成 int pcnum2 = randI.nextInt(48) + 1; int pcnum3 = randI.nextInt(48) + 1; boolean zahl1 = num1 == pcnum1; // 简化布尔值判断 boolean zahl2 = num2 == pcnum2; boolean zahl3 = num3 == pcnum3; if(zahl1 && zahl2 && zahl3) { credit[0] += 500; } else if((zahl1 && zahl2) || (zahl1 && zahl3) || (zahl2 && zahl3)) { credit[0] += 250; } else if(zahl1 || zahl2 || zahl3) { credit[0] += 100; } else { credit[0] -= 50; } ergLabel.setText(String.format("1. Number: %b 2. Number: %b 3. Number: %b", zahl1, zahl2, zahl3)); ghLabel.setText("Credit: " + credit[0]); } }); resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { num1Field.setText(""); num2Field.setText(""); num3Field.setText(""); ergLabel.setText(""); } }); frame.setVisible(true); } }
额外优化说明
- 简化随机数生成:
randI.nextInt(48) + 1替代分步赋值 - 简化布尔判断:直接用等式结果赋值给布尔变量,省去冗余if-else
- 改用else-if逻辑:避免多个中奖条件同时触发,保证逻辑严谨性
内容的提问来源于stack exchange,提问作者PsydoV2
相关产品推荐
相关产品推荐

