在 Firebase onDataChange 中更改 JavaFX 节点不起作用
Changing JavaFX nodes in Firebase onDataChange not working
我正在开发一个使用 Firebase 实时数据库的 JavaFX 管理应用程序。我创建了一个 ValueEventListener,它在 onDataChange 中获取我需要的数据。有了这些数据,我想调用一个方法来处理这些数据。我 运行 遇到的问题是从这个 onDataChange 方法内部更改 JavaFX 元素根本不起作用。
我曾尝试通过将所有内容放在一个 class 中并将所有功能放在 onDataChange 方法中来缩小问题范围,但这也行不通。
最让我困惑的是读取这些元素工作正常,而更改它们不会产生任何结果。当我从 onDataChange 外部执行此代码时它确实有效。
数据库助手中的代码class:
public void startDropsListener() {
dropsRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
OverviewController.getInstance().changeNodes();
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Reading from database failed: " + databaseError.getCode());
}
});
}
更改节点的方法:
public void changeNodes() {
System.out.println(title.getText()); // This does return the node's text.
title.setText("New title"); // Does not update the node's text.
}
更新:
更改后打印标题似乎有效,因此尽管未显示,但该值似乎已更新。以下是与实例相关的代码,以防出现问题:
private static OverviewController instance;
public OverviewController() {
instance = this;
}
public static OverviewController getInstance() {
if(instance == null){
instance = new OverviewController();
}
return instance;
}
不要让控制器成为单例。
并且这样做...
public class OverviewController implements Initializable{
@FXML
public Label label;
@Override
public void initialize(URL location, ResourceBundle bundle){
DatabaseReference dropsRef = FirbaseDatabase.DatabaseReference("Node");
dropsRef.addValueEventListener(valueEventListener);
}
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Plateform.runLater(()->label.setText(dataSnashot.getValue(SomeClass.class).getLabel());
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Reading from database failed: " + databaseError.getCode());
}
});
}
我正在开发一个使用 Firebase 实时数据库的 JavaFX 管理应用程序。我创建了一个 ValueEventListener,它在 onDataChange 中获取我需要的数据。有了这些数据,我想调用一个方法来处理这些数据。我 运行 遇到的问题是从这个 onDataChange 方法内部更改 JavaFX 元素根本不起作用。
我曾尝试通过将所有内容放在一个 class 中并将所有功能放在 onDataChange 方法中来缩小问题范围,但这也行不通。
最让我困惑的是读取这些元素工作正常,而更改它们不会产生任何结果。当我从 onDataChange 外部执行此代码时它确实有效。
数据库助手中的代码class:
public void startDropsListener() {
dropsRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
OverviewController.getInstance().changeNodes();
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Reading from database failed: " + databaseError.getCode());
}
});
}
更改节点的方法:
public void changeNodes() {
System.out.println(title.getText()); // This does return the node's text.
title.setText("New title"); // Does not update the node's text.
}
更新: 更改后打印标题似乎有效,因此尽管未显示,但该值似乎已更新。以下是与实例相关的代码,以防出现问题:
private static OverviewController instance;
public OverviewController() {
instance = this;
}
public static OverviewController getInstance() {
if(instance == null){
instance = new OverviewController();
}
return instance;
}
不要让控制器成为单例。 并且这样做...
public class OverviewController implements Initializable{
@FXML
public Label label;
@Override
public void initialize(URL location, ResourceBundle bundle){
DatabaseReference dropsRef = FirbaseDatabase.DatabaseReference("Node");
dropsRef.addValueEventListener(valueEventListener);
}
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Plateform.runLater(()->label.setText(dataSnashot.getValue(SomeClass.class).getLabel());
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("Reading from database failed: " + databaseError.getCode());
}
});
}