我正在尝试创建一个电影院预订系统,该系统允许用户购买门票和小吃,并在每次单击时刷新标签。
我有两节课:
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();
}
}
}
但是,当我单击座位时,影片的价格已正确添加,但Label变为“ null”,并给了我NullPointerException。
这里的奇怪之处在于,如果我再次单击任何小吃,标签会正确显示所选食物的价格加上每个所选座位的胶片的价格。
首先,我认为问题出在nullPointException上,因此我检查了this问题。然后,我试图了解扩展类as this是否可以调用Label并对其进行修改,答案似乎是肯定的,但是出于种种原因似乎不适用于我的情况。
谢谢大家。
答案 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命名约定,涉及代码复制,我看到大量的代码可以生成,就像我在上面的方法中向您展示的那样
好先生,祝您好运。如果无法正常工作,我可以发布完整的课程,但是我认为您应该尝试将其视为一种良好的做法,并且为您提供了所有需要的代码,如果您需要更多帮助,请告诉我