gpt4 book ai didi

java - 使用循环在一个类中为另一个类的多个实例中的按钮添加 ActiveListener

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:24 25 4
gpt4 key购买 nike

我有一个名为 InstructionBlock 的类(class),这是一个 JPanel在我的主窗体(JFrame)上,我创建了 InstructionBlock 的 6 个实例。 。我需要让我的主窗体根据 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。为了解决这个问题,不要使用类字段,而是使用内部最终变量,例如:

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

作为附带建议,为了现在帮助我们以及将来帮助您自己,请编辑您的代码并更改变量名称以符合 Java Java naming conventions 。变量名应全部以小写字母开头,而类名应以大写字母开头。学习并遵循这一点将使我们更好地理解您的代码,并且将使您更好地理解其他人的代码。

关于java - 使用循环在一个类中为另一个类的多个实例中的按钮添加 ActiveListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39009668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com