2017-01-03 65 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)); 
    } 
}