如何将iterator-variable作为param赋予ActionListener

时间:2018-02-02 15:29:52

标签: java swing actionlistener

我有一个JToggleButtons阵列数组。他们正在构建一个正方形,当点击它们时,它们应该调用一个方法并将它们各自的坐标作为参数。我的第一次尝试看起来像这样:

int row = 0;
int col = 0;
for (final JToggleButton[] buttonRow : opponentFieldButtons) {
    col = 0;
    for (final JToggleButton button : buttonRow) {
        JToggleButton newButton = new JToggleButton("O");
        square.add(newButton);
        newButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendCoor(row, col);
            }
        });
        opponentbg.add(Button1);
        col++;
    }
    col = 0;
    row++;
}

现在我在调用方法sendCoor()时得到以下错误:“在封闭范围中定义的局部变量必须是最终的或有效的最终”。 通常,您可以像这样初始化一个新的最终int:

public void actionPerformed(ActionEvent e) {
   final int cRow = row;
   final int cCol = col;
   sendCoor(cRow, cCol);
}

因为我们在一个循环中,所以这些变量也会设置好几次,因此错误保持不变:cRow和cCol不是最终的。

我可以创建一个实现ActionListener的全新类,并创建该类的实例,而不是我现在使用的匿名类。 但是,有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:3)

我认为你只是略微夸大了语法。尝试在代码中稍微不同的位置初始化这些变量。

int row = 0;
int col = 0;
for (final JToggleButton[] buttonRow : opponentFieldButtons) {
    col = 0;
    for (final JToggleButton button : buttonRow) {
        JToggleButton newButton = new JToggleButton("O");
        square.add(newButton);

        final int cRow = row;
        final int cCol = col;

        newButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendCoor(cRow, cCol);
            }
        });
        opponentbg.add(Button1);
        col++;
    }
    row++;
}

不在ActionListener内,这是导致错误的原因。在ActionListener的定义之外声明最终变量,以便在ActionListener看到它们之前它们是最终的。

答案 1 :(得分:1)

在您显示的方法中,

rowcol本地变量标题。

此方法在“初始化时间”执行。当调用actionPerformed()匿名内部类实现的方法ActionListener时,外部方法已经离开,并且两个变量不再存在。因此,变量本身不能在actionPerformed()内使用,只能在当前值中使用。当局部变量是最终的时,Java支持它。

只要你不改变值Java(8) implicity 将它们视为 final 并允许你在匿名内部使用它们的值类