扩展类中的其他方法可以修改Label吗?

时间:2019-03-05 15:07:07

标签: java javafx label extends

我正在尝试创建一个电影院预订系统,该系统允许用户购买门票和小吃,并在每次单击时刷新标签。

我有两节课:

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 "Subtotal"

Consolle Value

但是,当我单击座位时,影片的价格已正确添加,但Label变为“ null”,并给了我NullPointerException。

这里的奇怪之处在于,如果我再次单击任何小吃,标签会正确显示所选食物的价格加上每个所选座位的胶片的价格。

enter image description here enter image description here

enter image description here

首先,我认为问题出在nullPointException上,因此我检查了this问题。然后,我试图了解扩展类as this是否可以调用Label并对其进行修改,答案似乎是肯定的,但是出于种种原因似乎不适用于我的情况。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

所以有很多错误(夸大效果),但是您正在学习,所以我会尽力提供帮助。在复制并粘贴到程序之前,请仔细阅读所有内容

首先得到空指针的原因是由于您拥有extend DashBoardUserController,这意味着初始化程序的DashBoardUserController与您的{{1} },当您尝试访问它时,它为您提供了一个空指针,因为扩展类中未初始化任何内容

因此,第1步删除TheatresController

因此,既然不存在了,我们需要获取对该类的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;
}

最终学会的其他一些东西是java命名约定,涉及代码复制,我看到大量的代码可以生成,就像我在上面的方法中向您展示的那样

好先生,祝您好运。如果无法正常工作,我可以发布完整的课程,但是我认为您应该尝试将其视为一种良好的做法,并且为您提供了所有需要的代码,如果您需要更多帮助,请告诉我