Java Swing:在actionlistener中设置外部定义的变量

时间:2013-12-30 02:23:52

标签: java swing variables listener jbutton

我是使用swing的新手,我在使用动作听众时遇到了麻烦。我有一个动作监听器设置为按下按钮时,当我尝试设置在监听器外定义的变量的值时,我收到一条错误消息。这是代码

    // create puzzle object and array for puzzle numbers
    final Puzzle puzzle = new Puzzle();
    final int[][] nums = new int[9][9];

    // create buttons
    JButton btnSolve = new JButton("Solve");
    btnSolve.setEnabled(false);
    JButton btnGenerate = new JButton("Generate");

    // When generate button is clicked
    btnGenerate.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            // generate puzzle
            nums = puzzle.generate();

            // fill board with puzzle
            fillBoard(nums);

            // enable solve button
            btnSolve.setEnabled(true);
        }
    });

    // When solve button is clicked
    btnSolve.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            // solve the puzzle
            nums = puzzle.solve(nums);

            // fill board with solved puzzle
            fillBoard(nums);
        }
    });

如果我在btnGenerate监听器中声明nums和puzzle对象而没有它们是最终的,代码就可以工作。但是我想在btnSolve监听器中使用nums数组。

nums = puzzle.generate();行和nums = puzzle.solve(nums);行上收到错误:

  

无法分配最终的局部变量nums,因为它是在封闭类型中定义的

“在封闭式中定义”是什么意思?应该如何做?

提前致谢。

1 个答案:

答案 0 :(得分:2)

将此final int[][] nums = new int[9][9];声明为类成员,而不是final。消息很清楚。您无法修改final的内容。您可能也可能不需要使用Puzzle

进行相同操作
public class MyClass {

   int[][] nums = new int[9][9];   <-- class member instead of in constructor
   Puzzle puzzle = new Puzzle();

   public MyClass(){
   }
}