我有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,回到上一场景时还有其他方法可以更新余额标签吗?
答案 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。