我有一个名为InstructionBlock的类,它是一个JPanel
在我的主要表单JFrame上,我创建了6个InstructionBlock实例。我需要让我的主窗体基于在InstructionBlock实例中被按下的按钮来执行某些操作,并且它需要知道在哪个实例中按下了该按钮。

我在类InstructionBlock中有以下代码:

public void InstBlockAddActionListener(ActionListener al) {
    CheckMarkClicked.addActionListener(al);
}


我已经将InstructionBlock的实例添加到我的主表单中,如下所示:
ArrayList<InstructionBlock> instructionPane = new ArrayList<>(); int i;

for (int i = 0; i<6;i++) {
       instructionPane.add(new InstructionBlock());
       InstructionLayer.add(instructionPane.get(i));
    }


现在这是我遇到的问题:

for (i = 0; i<6;i++) {
        instructionPane.get(i).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(i+1);});
    }


当我按下第一个按钮时,我希望传递的值是1,但我传递的值是7

我知道我可以做到以下几点:

    instructionPane.get(0).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(1);});
    instructionPane.get(1).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(2);});
    instructionPane.get(2).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(3);});
    instructionPane.get(3).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(4);});
    instructionPane.get(4).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(5);});
    instructionPane.get(5).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(6);});


但是我不知道为什么循环不起作用。还有另一种方法可以使它起作用吗?

最佳答案

您的问题在这里:

for (i = 0; i<6;i++) {
    instructionPane.get(i).InstBlockAddActionListener((ActionEvent ae) -> {InstructionCheckMarkButtonPressed(i+1);});
}


您必须将i设置为类的字段才能进行编译,并通过此操作将其设置为7,并且在此for循环完成后仅将其设置为7。要解决此问题,请不要使用类字段,而应使用内部final变量,例如:

for (int j = 0; j < 6; j++) {
    final int finalIndex = j + 1;
    instructionPane.get(j).InstBlockAddActionListener((ActionEvent ae) -> {
        InstructionCheckMarkButtonPressed(finalIndex);
    });
}


作为附带建议,为了对我们现在有所帮助,并在将来对您有所帮助,请编辑代码并更改变量名以符合Java Java naming conventions。变量名都应以小写字母开头,而类名应以大写字母开头。学习和遵循此规则将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。

07-26 07:59