java fx fxml,控制器中所有JavaFX FXML对象为空

我意识到这个问题曾经被问过,但是没有一个解决方案对我有用.我正在从控制器启动线程,然后从那里线程从数据库中获取一些数据.线程将数据发送到控制器中实现的接口.当尝试从那里访问我的任何JavaFX元素时,我得到一个空指针异常.

这是我的控制器:

public class SettingsPage implements PrizeReceiver{

@FXML

AnchorPane settingsAnchor;

@FXML

ListView prizeList;

@FXML

TextField prizeField;

@FXML

Button load;

void init(AnchorPane rootPane){

BasicConfigurator.configure();

AnchorPane root = null;

try {

File file = new File(System.getProperty("user.dir") + "/src/main/res/settings.fxml");

root = FXMLLoader.load(file.toURI().toURL());

} catch (IOException e) {

e.printStackTrace();

}

if (root != null) {

rootPane.getChildren().setAll(root);

}

initPrizeList();

}

private void initPrizeList() {

GetPrizesThread getPrizesThread = new GetPrizesThread(Database.firebaseDatabase, this);

getPrizesThread.getThread().start();

}

@FXML

void addPrize(){

Database.createPrize(prizeField.getText());

}

@Override

public void receivePrizes(ArrayList prizes) {

ObservableList items = FXCollections.observableArrayList();

items.addAll(prizes);

//Iv'e tried this if else with every fxml object and always prints null

if(prizeField==null){

System.out.println("NULL");

}else {

prizeList.getItems().addAll(items);

}

}

}

这是线程:

public class GetPrizesThread implements Runnable {

private boolean finished = false;

private final Thread thread;

private FirebaseDatabase firebaseDatabase;

private PrizeReceiver prizeReceiver;

GetPrizesThread(FirebaseDatabase firebaseDatabase, PrizeReceiver prizeReceiver){

this.firebaseDatabase = firebaseDatabase;

this.prizeReceiver = prizeReceiver;

thread = new Thread(this);

}

@Override

public void run() {

ArrayList prizes = new ArrayList<>();

DatabaseReference databaseReference = firebaseDatabase.getReference("prizes");

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {

@Override

public void onDataChange(DataSnapshot snapshot) {

HashMap map = (HashMap) snapshot.getValue();

Set keySet = map.keySet();

ArrayList listOfKeys = new ArrayList(keySet);

prizes.clear();

prizes.addAll(listOfKeys);

finished = true;

}

@Override

public void onCancelled(DatabaseError error) {

finished = true;

}

});

while(!finished) {

try {

Thread.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

prizeReceiver.receivePrizes(prizes);

}

Thread getThread() {

return thread;

}

}

这是FXML文件(使用场景生成器构建):

xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1"

fx:controller="SettingsPage">

当我没有if / else时,这是我的错误:

Exception in thread "Thread-5" java.lang.NullPointerException

at SettingsPage.receivePrizes(SettingsPage.java:74)

at GetPrizesThread.run(GetPrizesThread.java:59)

at java.lang.Thread.run(Thread.java:748)

74行是

prizeList.getItems().addAll(items);

谢谢你的帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值