2016-05-08 7 views
0

Ich versuche, eine Methode zum Hinzufügen von SetOnMousePressed-Funktionen zu mehreren Knoten, und ich habe versucht, mit ein paar verschiedenen Schleifen usw., aber ich immer am Ende mit dem Fehler "Lokale Variable x in einem umschließenden Bereich definiert muss endgültig oder effektiv endgültig sein. " Dies ist so weit, wie ich bekommen habe:Javafx Hinzufügen von Ereignishandlern in einer Schleife

public static int playerSelectingCategory(int intScorecard[][], Rectangle[][] scoreboardBackground, int categoryCounter, int nrOfPlayers, boolean limitCheck) 

    { 
    int counter = 0; 
    int y = 0; 

    for(int x = 0; x<YatzyConstants.getNrCategories(); x++) 
    { 
    if(counter < nrOfPlayers) 
    { 
     if(y < YatzyConstants.getNrCategories()) 
     { 
      scoreboardBackground[counter][y].setOnMousePressed(e -> 
      { 
        scoreboardBackground[counter][y].setFill(javafx.scene.paint.Color.ALICEBLUE); 
      }); 
      y++; 
     } 
     counter++; 

    }} 
    return intScorecard[counter][y]; 
} 

erklärte ich ursprünglich alles eins nach dem anderen, aber ich habe zu glauben, dass es ein effektiver Weg sein sollte, es zu tun. Jede Hilfe wird geschätzt, hier wird wirklich eine Mauer geschlagen.

Antwort

0

Da y durch Ihren Code geändert wird, ist es nicht effektiv final und kann daher nicht von einer anonyme Klasse oder einem Lambda-Ausdruck aus aufgerufen werden. Das gleiche gilt für counter.

würde ich empfehlen scoreboardBackground[counter][y] in einer Variablen zu speichern, die ist (effektiv) final (das heißt, es sei denn das Array geändert wird und Sie die Rectangle an der Position färben, wo die ursprüngliche rect gespeichert wurde ...):

final Rectangle rect = scoreboardBackground[counter][y]; 
rect.setOnMousePressed(e -> { 
    rect.setFill(javafx.scene.paint.Color.ALICEBLUE); 
}); 

alternativ einfach Oder die Node verwenden, die die Quelle des Ereignisses ist:

final EventHandler<MouseEvent> handler = event -> { 
    ((Shape) event.getSource()).setFill(javafx.scene.paint.Color.ALICEBLUE); 
}; 

for(int x = 0; x<YatzyConstants.getNrCategories(); x++) 
{ 
    if(counter < nrOfPlayers) 
    { 
     if(y < YatzyConstants.getNrCategories()) 
     { 
      scoreboardBackground[counter][y].setOnMousePressed(handler); 
      y++; 
     } 
.... 
Verwandte Themen