не могу сохранить значение вне класса - PullRequest
0 голосов
/ 10 июня 2018

Обновление Все, что я хочу сделать, это просто сохранить значение метки в другом классе.Это моя самая большая проблема, и, похоже, ничего не работает.

Я работаю над проектом 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 и получу голосование вниз, я просто хотел знать, почему моя переменная возвращает ноль при попытке сохранить ее в другом классе,Очевидно, что переменная "holder" не является нулевой, поскольку я проверил ее, установив для нее другую метку.

Вот изображение, которое поможет сделать его более ясным

Я успешнополучил текст от лейбла money и установил его в int holder.Затем я устанавливаю значение держателя для метки tst.Однако, когда я пытаюсь установить значение владельца другого класса, я получаю нулевой указатель.

РЕДАКТИРОВАТЬ Я инициализировал BankData bank = new BankData () и попытался изменить переменные на int.Я просто получаю 0 вместо нуля.

РЕДАКТИРОВАТЬ 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 голосов
/ 11 июня 2018

Вам нужно поделиться моделью между классами контроллера.Есть несколько вопросов по этому поводу на 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.

0 голосов
/ 10 июня 2018

Вы никогда не инициализировали свой объект банка в своем конструкторе.

BankData bank = new BankData ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...