【问题标题】:Variable used in lambda expression should be final or effectively final?lambda 表达式中使用的变量应该是最终的还是有效的最终?
【发布时间】:2018-10-15 11:02:39
【问题描述】:

我正在尝试创建一个小游戏作为一个项目来帮助自己学习如何编码。基本上我想有2个按钮。其中一个将生成一个新的随机数,另一个将允许您猜测该数字。我遇到的错误是我无法创建一个 Actionlistener,它会在单击按钮时生成一个新数字,因为它不允许我在 Lambda 表达式本身之外更改 int。

非常感谢任何帮助!

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

/**
 * Created by Alex on 10/15/2018.
 */
public class NumberGame
{

    public static void main(String[] args) {
        int gamesNumber = 0;
        int myNumber;

        JFrame gameGUI = new JFrame("Number guess game");
        gameGUI.setSize(400,400);
        gameGUI.setVisible(true);
        gameGUI.setLayout(null);
        gameGUI.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //Create components for GUI
        JLabel AmIRight = new JLabel();
        JLabel generateNumber = new JLabel();
        JButton chooseNumber = new JButton("Choose");

        JButton generateNumber2 = new JButton("Generate");
        generateNumber2.addActionListener(e -> {
            Random rand = new Random();
            int number = rand.nextInt(10) + 1;
            gamesNumber = number;
            System.out.println(gamesNumber);
        });

        //Calling Methods
        //gamesNumber = GenerateRandomNumber();

        //Adding components to GUI
        gameGUI.add(AmIRight);
        gameGUI.add(chooseNumber);
        gameGUI.add(generateNumber);
        gameGUI.add(generateNumber2);

        //Give components properties
        AmIRight.setBounds(40,100,300,300);
        AmIRight.setText("Push the button below to choose a number to guess!");
        generateNumber.setBounds(60,-100,300,300);
        generateNumber.setText("Push the button below to Generate a number!");
        chooseNumber.setBounds(130,270,100,50);
        generateNumber2.setBounds(130,70,100,50);

    }


}

【问题讨论】:

标签: java swing


【解决方案1】:

您需要将gamesNumber 定义为成员字段

public class NumberGame
{
    private static int gamesNumber = 0;
    public static void main(String[] args) {
        int myNumber;

        JFrame gameGUI = new JFrame("Number guess game");

【讨论】:

  • 你试过了吗?现在我收到编译器错误“无法对非静态字段 gamesNumber 进行静态引用”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多