不能在班级

时间:2018-06-10 19:04:22

标签: java javafx

更新我想要做的只是将标签的值保存到另一个类。这是我最大的问题,似乎没什么用。

我已经在javafx项目上工作了几个星期。我差点儿已经完成但在课堂上传达信息时遇到了麻烦。 2天后,我仍然无法弄清楚为什么它不会工作。以下是一些代码:

我初始化数据的类:

 @FXML
 Label money; 
 @FXML
 int holder;
 @FXML
 Label tst;
 int currency;
 BankData bank;

 //this is where text for money label is set from user input
 public void presetMoney(ActionEvent e) { 
        if(e.getSource() == ten)    {
            currency += 10;
            money.setText(Integer.toString(currency));
        }
 //this is where I try to retrieve the value of money
  public void testing() {
        this.holder = Integer.parseInt(money.getText());        
        bank.storeData(holder);
        tst.setText(Integer.toString(holder));
    }

    public int getTesting() {
        return this.holder;
    }

BankData.java(我正在尝试设置数据的类):

 String data;
 public void storeData(String data) {
     this.data = data;
 }

但当然,我收到了这个错误:

Caused by: java.lang.NullPointerException
at application.TransactionScreenController.testing(TransactionScreenController.java:159)
... 58 more

在我被重定向到某个NullPointer帖子并获得downvoted之前,我只是想知道为什么我的变量在尝试将其保存到另一个类时返回null。显然,变量“holder”不是null,因为我通过将它设置为另一个标签来测试它。

Here is a picture to help make it more clear

我成功从Label money获得文本并将其设置为int holder。然后我将holder的值设置为标签tst。但是,当我尝试将holder的值设置为另一个类时,我得到一个nullpointer。

编辑我初始化了BankData bank = new BankData()并尝试将变量更改为int。我只是得到0而不是null。

编辑2 所以我尝试了FXML注入,现在我得到了一个类异常

public void trasComplete(ActionEvent e) throws IOException {            
        FXMLLoader loader = new FXMLLoader();   
        //methods to change screen not included because of irrelevance
        BankData n = loader.getController();
        n.storeData(holder);
}

Caused by: java.lang.ClassCastException: application.SecrurityScreenController cannot be cast to application.BankData
at application.TransactionScreenController.trasComplete(TransactionScreenController.java:173)
... 58 more

2 个答案:

答案 0 :(得分:0)

您从未在构造函数中初始化银行对象。

BankData bank = new BankData();

答案 1 :(得分:0)

您需要在控制器类之间共享模型。 Stack Overflow上已经存在一些关于此的问题。

对于您的情况,最简单且破坏性最小的解决方案是使BankData成为单身人士。这会使您的BankData包括:

public class BankData {

    private static final BankData INSTANCE = new BankData();

    // or make INSTANCE public, get rid of this method, and
    // use BankData.INSTNACE to access the instance
    public static BankData getInstance() {
        return INSTANCE;
    }

    // private constructor to stop any unwanted instantiations
    private BankData() {
        /* do any initialization */
    }

    // your other methods...

}

然后在两个您的控制器类中,您使用BankData初始化private BankData bank = BankData.getInstance();。你也可以摆脱这个领域,只要你需要使用它就可以调用BankData.getInstance()

修改

在第二次编辑中,您尝试设置实例,但获得了ClassCastException。那是因为你做了:

BankData bank = loader.getController();

将抛出所述异常,因为loader.getController()返回在load()期间实例化的控制器。相反,您的代码应如下所示:

SecrurityScreenController controller = loader.getController();
controller.getBankData().storeData(holder); 

此代码是否允许您在控制器之间共享数据取决于您在项目的更大范围内实现此操作的方式。我只是想告诉你为什么得到ClassCastException