0

We have a listview that listens to the selection made by a combobox. However, when trying to use that combobox to switch between the observable lists displayed by the listview, we get errors.

eclipse error: Local variable inventoryItems defined in an enclosing scope must be final or effectively final

eclipse error: Local variable inventoryPrices defined in an enclosing scope must be final or effectively final

public static void GUI(Stage primaryStage){

ComboBox itemList = new ComboBox(FXCollections.observableArrayList(
   "Menu Items", "Drink Items", "Dessert Items","Gift Shop Items")
);

ListView<String> inventory = new ListView<String>();
ListView<String> inventoryP = new ListView<String>();

ObservableList<String> inventoryItems;
ObservableList<String> inventoryPrices;

// Listener for inventory. When item in inventory is selected, the corresponding price is also selected

itemList.setOnAction(e -> {

if (itemList.getSelectionModel().getSelectedItem().toString() == "Menu Items") {

inventoryItems =FXCollections.observableArrayList (Register.menuItemNames);
inventory.setItems(inventoryItems);

inventoryPrices =FXCollections.observableArrayList(Register.menuItemPrices);
inventoryP.setItems(inventoryPrices);
}
else if (itemList.getSelectionModel().getSelectedItem().toString() == "Drink Items") {

inventoryItems =FXCollections.observableArrayList (Register.drinkItemNames);
inventory.setItems(inventoryItems);

inventoryPrices =FXCollections.observableArrayList (Register.drinkItemPrices);
inventoryP.setItems(inventoryPrices);
}
});
AStein
  • 1

1 Answers1

0

The error message already tells you what the issue is. Any local variable from the enclosing scope accessed in an anonymous inner class or lambda expression can only be assigned a value once.

Here I can't see why you would need to declare the lists outside the lambda expressions:

ComboBox itemList = new ComboBox(FXCollections.observableArrayList(
   "Menu Items", "Drink Items", "Dessert Items","Gift Shop Items")
);

ListView<String> inventory = new ListView<String>();
ListView<String> inventoryP = new ListView<String>();


// Listener for inventory. When item in inventory is selected, the corresponding price is also selected

itemList.setOnAction(e -> {

    if (itemList.getSelectionModel().getSelectedItem().toString().equals("Menu Items")) {

        ObservableList<String> inventoryItems =FXCollections.observableArrayList (Register.menuItemNames);
        inventory.setItems(inventoryItems);

        ObservableList<String> inventoryPrices =FXCollections.observableArrayList(Register.menuItemPrices);
        inventoryP.setItems(inventoryPrices);

    }
    else if (itemList.getSelectionModel().getSelectedItem().toString().equals("Drink Items")) {

        ObservableList<String> inventoryItems =FXCollections.observableArrayList (Register.drinkItemNames);
        inventory.setItems(inventoryItems);

        ObservableList<String> inventoryPrices =FXCollections.observableArrayList (Register.drinkItemPrices);
        inventoryP.setItems(inventoryPrices);

    }

});

Also note I fixed the error you had for comparing strings.

Community
  • 1
  • 1
James_D
  • 201,275
  • 16
  • 291
  • 322