nullPointerException以及如何正确更新标签?

时间:2018-08-09 12:49:50

标签: java class javafx

我有2个场景: 第一个带有“余额”标签,其中显示了变量的余额。

第二个场景是用户添加到天平中的存款场景。

(每个场景都有其控制器类)

我希望在用户返回第一个场景时更新余额。 最好的方法是什么?我找不到所显示场景的事件,我在网上仅找到一个舞台示例,当关闭窗口时会触发一个事件,但是这里我只是通过更改主舞台场景来更改场景。

我试图在第二个场景的类中创建第一个场景类的对象,并在单击后退按钮时调用一种方法来更改标签文本,但这没用。

这是第一个场景的代码,其中lbBalance是我要更新的标签,updateBal是我在第二个场景类中使用的方法。

public class accountController extends Controller implements Initializable {

    @FXML private Label gilbert;
    @FXML private Label lbBalance;
    @FXML private Button deposit;
    @FXML private Button btn_showBalance;
    private application.depositController depositController;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        lbBalance.setText(String.valueOf(BAL));
    }

    @FXML
    public void handleDeposit(ActionEvent event) throws IOException {
        Parent depositParent = FXMLLoader.load(getClass().getResource("deposit.fxml"));
        depositScene = new Scene(depositParent);
        mainStage.setScene(depositScene);       
        mainStage.show();
    }

    public void updateBal() {
        lbBalance.setText(String.valueOf(BAL));
    }

}

这是第二场景的课

accountController backtoscene= new accountController();
@FXML private Label info;
@FXML private Button btn_depositfinal;
@FXML private TextField depositamount;
@FXML private Button btn_back;

public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub
}

@FXML
public void handleDepositFinal(ActionEvent event) {
    deposit(Integer.parseInt(depositamount.getText()));
    info.setVisible(true);
}

@FXML
public void handleBackButton(ActionEvent event) throws IOException {
    backtoscene.updateBal();
    mainStage.setScene(newscene);

}

TL; DR调用该方法会给我一个nullPointerException,回到上一场景时还有其他方法可以更新余额标签吗?

1 个答案:

答案 0 :(得分:0)

注意:我还没有测试代码,我只是徒手编写的,但是它给了您一个大致的想法。

您的主要问题是您要在DepositController中创建一个新的AccountController。这意味着它与您最初实例化的是不同的。

public class AccountController extends Controller implements Initializable {

    @FXML private Label gilbert;
    @FXML private Label lbBalance;
    @FXML private Button deposit;
    @FXML private Button btn_showBalance;
    private application.DepositController depositController;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        lbBalance.setText(String.valueOf(BAL));
    }

    @FXML
    public void handleDeposit(ActionEvent event) throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("deposit.fxml"));
        Parent depositParent = loader.load();  
        depositScene = new Scene(depositParent);
        depositController = loader.getController();
        depositController .setAccountController(this);

        mainStage.setScene(depositScene);       
        mainStage.show();
    }

    public void updateBal() {
        lbBalance.setText(String.valueOf(BAL));
    }

}

这是第二个类,您需要将AccountController设置为最初初始化的类:

public class DepositController extends Controller implements Initializable {
    AccountController backtoscene;
    @FXML private Label info;
    @FXML private Button btn_depositfinal;
    @FXML private TextField depositamount;
    @FXML private Button btn_back;

    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
    }
    public void setAccountController(AccountController controller){
        backtoscene = controller;
    }

    @FXML
    public void handleDepositFinal(ActionEvent event) {
        deposit(Integer.parseInt(depositamount.getText()));
        info.setVisible(true);
    }

    @FXML
    public void handleBackButton(ActionEvent event) throws IOException {
        backtoscene.updateBal();
        mainStage.setScene(newscene);

    }
}

现在您可以访问最初在开始时初始化的AccountController,并且AccountController可以访问正确的DepositController。