遍历两个列表的平滑方式JavaFX

遍历两个列表的平滑方式JavaFX,java,javafx,collections,lambda,Java,Javafx,Collections,Lambda,我有两组对象,第一组存储标签,第二组存储按钮。每个标签都连接到自己的按钮,即标签11放置在btn11上,依此类推。如果单击标签按钮,我想更改标签的可见性。我是这样做的: btn11.setOnAction(x->label11.setVisible(true)); btn12.setOnAction(x->label12.setVisible(true)); btn21.setOnAction(x->label21.setVisible(true));

我有两组对象,第一组存储标签,第二组存储按钮。每个标签都连接到自己的按钮,即标签11放置在btn11上,依此类推。如果单击标签按钮,我想更改标签的可见性。我是这样做的:

    btn11.setOnAction(x->label11.setVisible(true));
    btn12.setOnAction(x->label12.setVisible(true));
    btn21.setOnAction(x->label21.setVisible(true));
    btn22.setOnAction(x->label22.setVisible(true));
    btn111.setOnAction(x->label111.setVisible(true));
    btn112.setOnAction(x->label112.setVisible(true));
    btn121.setOnAction(x->label121.setVisible(true));
    btn122.setOnAction(x->label122.setVisible(true));
这样,我必须一行一行地写每一行代码,这使得我的代码不必要,而且很难阅读。我尝试将它们放在两个列表中,但找不到在一个循环中迭代两个列表的方法。 到目前为止,我成功地创建了如下内容:

for(int i=0;i<listOfButtons.size();i++){
        listOfButtons.get(i).setOnAction(x->listOfLabels.get(i).setVisible(true));
    }
但我得到的错误是lambda表达式中的变量应该是final。 我很高兴能得到任何帮助。
提前感谢。

在lambda中使用最终变量之前,将需要的值分配给该变量。这也将增加可读性

for (int i = 0; i < listOfButtons.size(); i++) {
    final Button button = listOfButtons.get(i);
    final Label label = listOfLabels.get(i);
    button.setOnAction(x -> label.setVisible(true));
}

您可以通过使用一些额外的Java 8功能,而不是传统的for和final声明,以更平滑的方式来实现它,这些声明应该用i解决问题,因此可以用final int fi=i修复;在lambda中使用最后一个。或者这个:

IntStream.range(0, buttons.size())
        .forEach(i -> buttons.get(i).setOnAction(e -> labels.get(i).setVisible(true)));
此外,考虑到您的标签和按钮引用命名不好的示例,我还建议您将这对引用放在一个方便的类和一个组件列表中

class ButtonLabelPair {
    Button button;
    Label label;
}

List<ButtonPairs> buttonPairs = ...
或者,您可以在该对的构造函数中执行此操作:

class ButtonLabelPair {
    ...
    public ButtonLabelPair(Button button, Label label) {
        this.button = button;
        this.label = label;
        this.button.setOnAction(e -> this.label.setVisible(true));
    }
}

你们试过一个普通的for循环和一个数组吗?我试过,但找不到使它工作的方法。你们能详细说明你们的代码是如何工作的吗?你在期待什么,到底发生了什么?如果您遇到异常/错误,请发布发生该异常/错误的行以及异常/错误详细信息。请将这些详细信息输入,否则我们可能无法提供帮助。我编辑了我的帖子,这是我唯一想到的想法。
class ButtonLabelPair {
    ...
    public ButtonLabelPair(Button button, Label label) {
        this.button = button;
        this.label = label;
        this.button.setOnAction(e -> this.label.setVisible(true));
    }
}