Может ли метка быть изменена другим методом внутри расширенного класса? - PullRequest
2 голосов
/ 05 марта 2019

Я пытаюсь создать систему бронирования в Кино, которая позволяет Пользователю приобретать билеты и закуски, и при каждом нажатии обновляет ярлык.

У меня есть два класса:

public class DashboardUserController{

  public Label subtotal;
  public static Double subtotalCounter = 0.0;
  public static Double filmPrice;

  @FXML
  public void onWaterBottleClick(){
    subtotalCounter = subtotalCounter + 1.50;
    orderRecipt = orderRecipt + "Water Bottle 1.50£ \n";
    setSubtotal();
  }
  // and similar methods for each type of snack 

public void setSubtotal(){
    subtotal.setText(subtotalCounter.toString() + " £");
  }

// set the price for each click on the label

  public void addTicket() {
    System.out.println(subtotalCounter);
    subtotalCounter = subtotalCounter + filmPrice;
    setSubtotal();
  } 
}

И еще один класс, который расширяет DashboardUserController

public class TheatresController extends DashboardUserController {

  @FXML
  private void onClick(MouseEvent event) {                  //method for selection/deselection of seats
    ImageView imageView = (ImageView) event.getSource();
    if (imageView.getImage() == redSeat) {
      Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Do you want to proceed with the unbooking?", ButtonType.YES, ButtonType.NO);
      if (alert.showAndWait().orElse(ButtonType.NO) == ButtonType.YES) {
        imageView.setImage(imageView.getImage() == redSeat ? greenSeat : redSeat);
      }
    } else {
      Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Do you want to proceed with the booking?", ButtonType.YES, ButtonType.NO);
      if (alert.showAndWait().orElse(ButtonType.NO) == ButtonType.YES) {
        imageView.setImage(imageView.getImage() == redSeat ? greenSeat : redSeat);
        addTicket();
      }
    }
  }

Теперь, если я нажму на кнопки питания, счетчик итогов и Метка обновятся правильно: Notice the right-bottom Label

Consolle Value

Но когда я нажимаю на места, цена на фильм корректно добавляется, но метка становится "нулевой" и дает мне исключение NullPointerException.

Странная вещь в том, что, если я снова нажму на любой перекус, ярлык правильно отобразит цену выбранного продукта плюс цену фильма для каждого выбранного места.

enter image description here enter image description here

enter image description here

Сначала я подумал, что проблема в исключении nullPointException, поэтому я проверил этот вопрос. Затем я попытался понять, может ли расширенный класс , как этот , вызвать Label и изменить его, ответ кажется да, но по ужасной причине, похоже, не подходит для моего сценария.

Спасибо всем.

1 Ответ

1 голос
/ 06 марта 2019

Так что здесь много неправильного (преувеличение для эффекта), но вы учитесь, поэтому я сделаю все возможное, чтобы помочь. Пожалуйста, прочитайте все это перед копированием и вставкой в ​​вашу программу, чтобы вы поняли это

Причина, по которой вы получили нулевой указатель, была в том, что у вас было extend DashBoardUserController, что означает, что DashBoardUserController, с которым была инициализирована программа, не говорил с вашим TheatresController, и когда вы пытались доступ к нему дал нулевой указатель, потому что в расширенном классе ничего не было инициализировано

Итак, Шаг 1 удалите extend DashBoardUserController

Итак, поскольку этого нет, нам нужно получить ссылку DashBoardUserController на этот класс, чтобы он мог вызывать необходимые методы, которые мы можем сделать при инициализации TheatresController, например,

        FXMLLoader loader = new FXMLLoader(getClass().getResource(resourceLocation));
        Pane pane = loader.load();
        TheatresController controller = loader.getController();
        controller.setDashBoardUserControllerReference(this);//We'll get here

Далее нужно сделать необходимые методы и переменные в TheatresController

private DashboardUserController dashboardUserController;//Set at top of class

public void setDashBoardUserControllerReference(DashboardUserController dashboardUserController){
    this.dashboardUserController = dashboardUserController;
}

Готово, это исправит нулевой указатель, перемещающийся для генерирования вашего метода, потому что есть много кода, который для вас не нужен, набрав

@FXML
public void onjosephclick() {
    //weekPickerInput();                                //You can delete from here
    //addFilmsInList();
    //filmList.setShowLocation("Joseph P");
    //System.out.println("joseph button pressed");
    //try {
    //    Pane pane = FXMLLoader.load(getClass().getResource("scenes/josephpane.fxml"));
    //    seatsSelection.getChildren().setAll(pane);
    //} catch (IOException e) {
    //    System.out.println(e);
    //}
    //setStuff();
    //seatsavailable.setText(Integer.toString(seatsJoseph));
    //filmPrice = filmList.searchFilm().get().getPrice();
    //System.out.println("Price:"+filmPrice);            //Down to here
    genericOnClick("Joseph P","scenes/josephpane.fxml",seatsJoseph);
    //change the strings for each call and remove the unnecessary stuff 
    //in the methods it will clean it up a lot
}

private void genericOnClick(String location, String resourceLocation, int seats) {
    weekPickerInput();
    addFilmsInList();
    filmList.setShowLocation(location);
    System.out.println("Location:"+location);
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource(resourceLocation));
        Pane pane = loader.load();
        TheatresController controller = loader.getController();
        controller.setDashBoardUserControllerReference(this);
        seatsSelection.getChildren().setAll(pane);
    } catch (IOException e) {
        System.out.println(e);
    }
    setStuff();
    seatsavailable.setText(Integer.toString(seats));
    filmPrice = filmList.searchFilm().get().getPrice();
    System.out.println("Price:"+filmPrice);
}

Некоторые другие вещи, которые можно научиться изучать в конечном итоге, это соглашения об именах java, связанные с репликацией кода. Я видел хороший объем кода, который можно обобщить, как я показал вам в приведенном выше методе

Код удачи на сэр. Если он не работает, я могу опубликовать полный класс, но я думаю, что вы должны попытаться выяснить это как хорошую практику, и я дал вам весь код, который вам нужен, дайте мне знать, если вам нужна дополнительная помощь

...