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

JFrame彩票程序信用值无法持久化问题及变量作用域咨询

解决方案

问题根源

每次点击Start按钮时,代码里的int credit = 500;都会重新执行,导致信用值被强制重置为初始值。必须把credit变量的声明移到ActionListener外部,同时保证内部类能访问并修改它。

具体修改步骤

  1. 调整变量作用域:在main方法中、startButton.addActionListener代码之前,用数组包装信用值变量(Java匿名内部类可访问final引用类型变量并修改其内部值):

    final int[] credit = {500};
    

    也可以把credit定义为类的静态成员变量,让内部类直接访问:

    public class lotto {
        private static int credit = 500;
        public static void main(String[]args) {
            // 原有代码
        }
    }
    
  2. 修改ActionListener内的代码:移除内部的int credit = 500;,把所有credit的直接引用改为数组元素引用(数组方案),比如:

    • credit = credit + 500; → credit[0] += 500;
    • 最后更新标签文本时用ghLabel.setText("Credit: " + credit[0]);
  3. 修复代码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:15:33