Я реализую пользовательский интерфейс для меню ресторана, включающего большое количество кнопок увеличения и уменьшения, как показано ниже - обратите внимание, я использовал SceneBuilder для создания пользовательского интерфейса:
Я пытался многочисленные методы, позволяющие циклически проходить по каждой кнопке и обновлять текстовое поле рядом с ней по щелчку мыши, но не удалось реализовать это через arrayList - я получаю сообщение об ошибке нулевого указателя, когда знаю, что массив успешно заполнен кнопками. Вот что я попробовал: у меня есть метод, который заполняет список, определяя fxids соответствующих кнопок следующим образом:
plusButtonList.add(soupPlus);
plusButtonList.add(guacPlus);
plusButtonList.add(empanadaPlus);
plusButtonList.add(jalapenoPlus);
plusButtonList.add(quesaPlus);
У меня также есть метод, который должен выполнять итерацию по каждому из эти кнопки, устанавливающие onaction для извлечения текущего значения счетчика из текстового поля (которое также находится в списке, но соответствующие кнопки и текстовые поля будут в той же индексированной позиции), этот метод вызывается в «initialise» в классе контроллера.
private void checkIfIncrement() {
for(int i = 0; i < 20; i++) {
int counter = i;
plusButtonList.get(i).setOnAction(e -> {
int currentCountVal = foodCounterList.get(counter);
theTextFields.get(counter).setText(Integer.toString(currentCountVal+ 1));
foodCounterList.set(counter, currentCountVal+1);
});
}
ПРИМЕЧАНИЕ: foodCounterList - это список целых чисел, содержащий текущее значение каждого текстового поля. «theTextFields» - это список, содержащий каждое из текстовых полей. ОБНОВЛЕНИЕ: Вот мой класс контроллера после попытки реализации предложенного улучшения Мэттом.
package customer;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
/**
* View for the customer.
* @author Arslan Nazir
*
*/
public class CustomerView {
@FXML
private ResourceBundle resources;
@FXML
private URL location;
@FXML
private ImageView imageview;
Stage stage;
@FXML
private Button soupPlus;
@FXML
private Button soupMinus;
@FXML
private TextField soupField;
@FXML
private Button guacMinus;
@FXML
private Button guacPlus;
@FXML
private TextField guacField;
@FXML
private Font x11322;
@FXML
private Button empanadaMinus;
@FXML
private TextField empanadaField;
@FXML
private Button empanadaPlus;
@FXML
private Button jalapenoMinus;
@FXML
private Button jalapenoPlus;
@FXML
private TextField jalapenoField;
@FXML
private Button quesaMinus;
@FXML
private Button quesaPlus;
@FXML
private TextField quesaField;
@FXML
private Button choriMinus;
@FXML
private Button choriPlus;
@FXML
private TextField choriField;
@FXML
private Button seafoodMinus;
@FXML
private Button seafoodPlus;
@FXML
private TextField seafoodField;
@FXML
private Button avocadoMinus;
@FXML
private Button avocadoPlus;
@FXML
private TextField avocadoField;
@FXML
private Button burritoMinus;
@FXML
private Button burritoPlus;
@FXML
private TextField burritoField;
@FXML
private Button chilliMinus;
@FXML
private Button chilliPlus;
@FXML
private TextField chilliField;
@FXML
private Font x113221;
@FXML
private Button churrosMinus;
@FXML
private Button churrosPlus;
@FXML
private TextField churrosField;
@FXML
private Button pastelMinus;
@FXML
private Button pastelPlus;
@FXML
private TextField pastelField;
@FXML
private Button brownieMinus;
@FXML
private Button browniePlus;
@FXML
private TextField brownieField;
@FXML
private Button strawbMinus;
@FXML
private Button strawbPlus;
@FXML
private TextField strawbField;
@FXML
private Button vanillaMinus;
@FXML
private Button vanillaPlus;
@FXML
private TextField vanillaField;
@FXML
private Font x11321;
@FXML
private Button colaPlus;
@FXML
private Button colaMinus;
@FXML
private TextField colaField;
@FXML
private Button dietColaMinus;
@FXML
private Button dietColaPlus;
@FXML
private TextField dietColaField;
@FXML
private Button mojitoMinus;
@FXML
private Button mojitoPlus;
@FXML
private TextField mojitoField;
@FXML
private Button blueMargMinus;
@FXML
private Button blueMargPlus;
@FXML
private TextField blueMargField;
@FXML
private Button redMargMinus;
@FXML
private Button redMargPlus;
@FXML
private TextField redMargField;
@FXML
private Button bottleWaterMinus;
@FXML
private Button bottleWaterPlus;
@FXML
private TextField bottleWaterField;
@FXML
private Button tapWaterMinus;
@FXML
private Button tapWaterPlus;
@FXML
private TextField tapWaterField;
@FXML
private Button closeprogram;
@FXML
private Button minimiseprogram;
@FXML
private VBox bgone;
@FXML
private Button callwaiter;
@FXML
private TextField summaryField;
static List<TextField> theTextFields = new ArrayList<>();
ArrayList<Button> plusButtonList = new ArrayList<>(Arrays.asList(soupPlus, guacPlus));
static List<Button> minusButtonList = new ArrayList<>();
static List<Integer> foodCounterList = new ArrayList<>();
public void listPopulate() {
theTextFields.add(soupField);
theTextFields.add(guacField);
theTextFields.add(empanadaField);
theTextFields.add(jalapenoField);
theTextFields.add(quesaField);
theTextFields.add(choriField);
theTextFields.add(seafoodField);
theTextFields.add(avocadoField);
theTextFields.add(burritoField);
theTextFields.add(chilliField);
theTextFields.add(churrosField);
theTextFields.add(pastelField);
theTextFields.add(brownieField);
theTextFields.add(strawbField);
theTextFields.add(vanillaField);
theTextFields.add(colaField);
theTextFields.add(dietColaField);
theTextFields.add(mojitoField);
theTextFields.add(blueMargField);
theTextFields.add(redMargField);
theTextFields.add(bottleWaterField);
theTextFields.add(tapWaterField);
for (int i = 0; i< theTextFields.size(); i++) {
theTextFields.get(i).setText("0");
}
minusButtonList.add(soupMinus);
minusButtonList.add(guacMinus);
minusButtonList.add(empanadaMinus);
minusButtonList.add(jalapenoMinus);
minusButtonList.add(quesaMinus);
minusButtonList.add(choriMinus);
minusButtonList.add(seafoodMinus);
minusButtonList.add(avocadoMinus);
minusButtonList.add(burritoMinus);
minusButtonList.add(chilliMinus);
minusButtonList.add(churrosMinus);
minusButtonList.add(pastelMinus);
minusButtonList.add(brownieMinus);
minusButtonList.add(strawbMinus);
minusButtonList.add(vanillaMinus);
minusButtonList.add(colaMinus);
minusButtonList.add(dietColaMinus);
minusButtonList.add(mojitoMinus);
minusButtonList.add(blueMargMinus);
minusButtonList.add(redMargMinus);
minusButtonList.add(bottleWaterMinus);
minusButtonList.add(tapWaterMinus);
/**
plusButtonList[0] = soupPlus;
plusButtonList[1] = guacPlus;
plusButtonList[2] = empanadaPlus;
plusButtonList[3] = soupPlus;
plusButtonList[4] = soupPlus;
plusButtonList[5] = soupPlus;
plusButtonList[6] = soupPlus;
plusButtonList[7] = soupPlus;
plusButtonList[8] = soupPlus;
plusButtonList[9] = soupPlus;
plusButtonList[10] = soupPlus;
plusButtonList[11] = soupPlus;
plusButtonList[12] = soupPlus;
plusButtonList[13] = soupPlus;
plusButtonList[14] = soupPlus;
plusButtonList[15] = soupPlus;
plusButtonList[16] = soupPlus;
plusButtonList[17] = soupPlus;
plusButtonList[18] = soupPlus;
plusButtonList[19] = soupPlus;
plusButtonList[20] = soupPlus;
plusButtonList[21] = soupPlus;
plusButtonList[22] = soupPlus;
plusButtonList.add(soupPlus);
plusButtonList.add(guacPlus);
plusButtonList.add(empanadaPlus);
plusButtonList.add(jalapenoPlus);
plusButtonList.add(quesaPlus);
plusButtonList.add(choriPlus);
plusButtonList.add(seafoodPlus);
plusButtonList.add(avocadoPlus);
plusButtonList.add(burritoPlus);
plusButtonList.add(chilliPlus);
plusButtonList.add(churrosPlus);
plusButtonList.add(pastelPlus);
plusButtonList.add(browniePlus);
plusButtonList.add(strawbPlus);
plusButtonList.add(vanillaPlus);
plusButtonList.add(colaPlus);
plusButtonList.add(dietColaPlus);
plusButtonList.add(mojitoPlus);
plusButtonList.add(blueMargPlus);
plusButtonList.add(redMargPlus);
plusButtonList.add(bottleWaterPlus);
plusButtonList.add(tapWaterPlus);
**/
foodCounterList.add(Integer.parseInt(soupField.getText()));
foodCounterList.add(Integer.parseInt(guacField.getText()));
foodCounterList.add(Integer.parseInt(empanadaField.getText()));
foodCounterList.add(Integer.parseInt(jalapenoField.getText()));
foodCounterList.add(Integer.parseInt(quesaField.getText()));
foodCounterList.add(Integer.parseInt(choriField.getText()));
foodCounterList.add(Integer.parseInt(seafoodField.getText()));
foodCounterList.add(Integer.parseInt(avocadoField.getText()));
foodCounterList.add(Integer.parseInt(burritoField.getText()));
foodCounterList.add(Integer.parseInt(chilliField.getText()));
foodCounterList.add(Integer.parseInt(churrosField.getText()));
foodCounterList.add(Integer.parseInt(pastelField.getText()));
foodCounterList.add(Integer.parseInt(brownieField.getText()));
foodCounterList.add(Integer.parseInt(strawbField.getText()));
foodCounterList.add(Integer.parseInt(vanillaField.getText()));
foodCounterList.add(Integer.parseInt(colaField.getText()));
foodCounterList.add(Integer.parseInt(dietColaField.getText()));
foodCounterList.add(Integer.parseInt(mojitoField.getText()));
foodCounterList.add(Integer.parseInt(blueMargField.getText()));
foodCounterList.add(Integer.parseInt(redMargField.getText()));
foodCounterList.add(Integer.parseInt(bottleWaterField.getText()));
foodCounterList.add(Integer.parseInt(tapWaterField.getText()));
}
private void checkIfIncrement() {
for (int i = 0; i < theTextFields.size(); i++) {
setButtonActionsForFoodItem(plusButtonList.get(i), theTextFields.get(i));
}
}
private void setButtonActionsForFoodItem(Button plusButton, TextField textField) {
plusButton.setOnAction(event -> {
int currentValue = Integer.parseInt(textField.getText());
textField.setText(String.valueOf(++currentValue));
});
}
/**for(int i =0; i < plusButtonList.size(); i++) {
int counter = i;
plusButtonList.get(i).setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
int currentCountVal = foodCounterList.get(counter);
theTextFields.get(counter).setText(Integer.toString(currentCountVal+ 1));
foodCounterList.set(counter, currentCountVal+1);
}
});
}**/
@FXML
private void handleCloseProgram(ActionEvent event) {
stage = (Stage)((Button)event.getSource()).getScene().getWindow();
stage.close();
System.exit(1);
}
@FXML
private void handleMinimiseProgram(ActionEvent event) {
stage = (Stage)((Button)event.getSource()).getScene().getWindow();
stage.setIconified(true);
}
@FXML
public void handle(ActionEvent event) {
}
@FXML
void initialize() {
//ButtonAndCountLists.setCounters();
listPopulate();
//System.out.println(plusButtonList.get(21));
System.out.println(foodCounterList.get(1));
checkIfIncrement();
}
}