【问题标题】:cant save value outside of class无法在课堂外节省价值
【发布时间】:2023-04-02 09:46:01
【问题描述】:

更新 我要做的只是将标签的值保存到另一个类。这是我最大的问题,似乎没有任何效果。

我已经在 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 帖子并被否决之前,我只想知道为什么我的变量在尝试将其保存到另一个类时返回 null。显然,变量“holder”不为空,因为我通过将其设置为另一个标签对其进行了测试。

Here is a picture to help make it more clear

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

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

EDIT 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

【问题讨论】:

  • FXML注入需要看吗?
  • 已编辑问题

标签: java javafx


【解决方案1】:

您需要在控制器类之间共享模型。 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...

}

然后在 both 您的控制器类中,您将使用 private BankData bank = BankData.getInstance(); 初始化您的 BankData。您也可以摆脱该字段,并在需要使用它的任何时候调用BankData.getInstance()


编辑

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

BankData bank = loader.getController();

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

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

此代码是否允许您在控制器之间共享数据取决于您如何在更大的项目范围内实现此功能。我只是想告诉你为什么你会收到ClassCastException

【讨论】:

  • 我没有将 BankData 设为单例(尽管我稍后会这样做),但我按照您所说的 ClassCastException 进行操作,我能够从持有者那里获取数据并将其传递给所需的屏幕。谢谢。
【解决方案2】:

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

BankData 银行 = new BankData();

【讨论】:

  • 如果持有人的值为“0”,那么这是正确的。当您尝试运行测试功能时,您的货币对象文本说明了什么?
  • 我在我的问题中包含了一张图片。 money 是一个标签,其值设置为按钮点击的总和。 Holder 是一个 int,它应该从钱中获取文本并存储它。然后 BankData 应该将持有人的价值(包含来自货币的文本)存储到其变量“数据”中。
  • 当你说你“得到 0 而不是错误”时——你从哪里得到 0?在 BankData 对象内的“数据”?您可以调试传递给该 storeData 函数的内容吗?我认为您需要准确查看生成 0 或“0”(整数或字符串)的位置。
  • 我创建了一个getTesting()方法并在main中创建了第一个类的实例。我调用了getTesting,它返回0。所以我猜问题出在第一类,因为持有人仍然为0,并且该值被传递到BankData。这让我感到困惑。 "holder" 可以为标签设置一个值,但在尝试将其传递给另一个类时会丢失该值。
猜你喜欢
  • 2023-01-16
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多