2017-01-03 80 views
-1

我有两组对象,第一个存储标签,第二个存储按钮。每个标签都连接到自己的按钮,即label11被放置在btn11等等。如果我点击它的按钮,我想更改标签的可见性。我能够做到这一点是这样的:通过两个列表迭代的平滑方式JavaFX

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)); 

做这样我有一个,这使得我的代码冤枉路,难以read.I到每行一个写试图将它们放置在两个名单,但couldn” t找到一种方法在一个循环中遍历两个列表。 到目前为止,我设法创造这样的事情:

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

但我发现了错误,说在lambda表达式的变量应该是最终的。 我很乐意提供任何帮助。 预先感谢您。

+0

你试过一个普通的'for'环和阵列? – 4castle

+0

我做过了,但找不到使其工作的方法。 – BednarQ

+0

你能详细说明你的代码“不起作用”吗?你在期待什么,究竟发生了什么?如果您遇到异常/错误,请发布其发生的行和异常/错误的详细信息。请[编辑]这些细节或我们可能无法提供帮助。 – 4castle

回答

2

在lambda使用它之前,指定你需要一个final变量的值。这也会增加可读性。

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)); 
} 
0

您可以通过使用一些额外的Java 8的功能,而不是传统的forfinal声明应该与i可以解决的问题,因此可以固定final int fi = i;和做一个“平滑” -er方式在你的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 = ... 

,并设置操作,如:

buttonPairs.forEach(p -> p.button.setOnAction(e -> p.label.setVisible(true))); 

或者,你可以在对的构造做:

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