我有一个名为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。变量名都应以小写字母开头,而类名应以大写字母开头。学习和遵循此规则将使我们能够更好地理解您的代码,并使您能够更好地理解其他人的代码。