当前位置: 首页 > 知识库问答 >
问题:

在Firebase onDataChange中更改JavaFX节点无效

郭博涉
2023-03-14

我正在开发一个与Firebase实时数据库一起工作的JavaFX管理应用程序。我创建了一个ValueEventListener,用于获取onDataChange中所需的数据。有了这些数据,我想调用一个调用一个方法来处理这些数据。我遇到的问题是,从onDataChange方法内部更改JavaFX元素根本不起作用。

我试图缩小问题的范围,将所有内容放在一个类中,并将所有功能放在onDataChange方法中,但这也不起作用。

最让我困惑的是,阅读这些元素效果很好,而更改它们却不会产生任何结果。当我从onDataChange外部执行此代码时,它确实起作用。

数据库助手类中的代码:

    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;
    }

共有1个答案

章心水
2023-03-14

不要把控制器变成一个单独的。像这样做...

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());
        }
    });
}
 类似资料:
  • 我试图在JavaFX ListView上实现onMouseEnter和onMouseExit事件。我想做的是,如果鼠标移动到列表视图的节点上,我想更改当前视图中当前可见的子节点的背景色。 这篇文章有一个伟大的代码示例,但不是我正在寻找的。将样式应用于javaFX中的TreeView子节点 使用该代码作为参考,我要寻找的是一个给定的树:

  • 我是JavaFX的新手。我试图编程一个简单的图形用户界面,但我面临着那些可能相关的问题。我用文件选择器设置文件,并想做相当基本的操作: 保存最后使用的文件夹 在VBox中写入选中文件的名称 这是我的代码(编译): 我无法刷新节点以设置当前初始目录或在VBox上显示collecName。我试图通过重新加载对象或调整窗口大小来重新生成它们,但没有任何效果。当我在控制台上打印变量时,我看到它们发生了变化

  • 我需要更改JavaFX中标签的锚点。我将锚点描述为选择来翻译底层节点的点。默认情况下,锚点似乎是左上角。 我试图通过如下描述的附加翻译来解决这个问题: 代码应转换标签,使其像右下角的锚点一样工作。这不起作用,因为在我执行代码时,标签的边界框是[minX:0.0,minY:0.0,minZ:0.0,宽度:-1.0,高度:-1.0,深度:0.0,maxX:-1.0,maxY:-1.0,maxZ:0.0

  • 我正在创建一个javafx程序,该程序的导航菜单通过更改场景的根来工作。根都是从Pane类继承的。有些窗格具有它们运行的后台线程。但是,当根窗格被事件处理程序更改时,窗格会切换,但后台线程不会停止。这会导致线程读取NFC时出现问题,并导致多个线程尝试从NFC读取器读取。 如何关闭后台线程?(从创建线程的窗格外部),还是需要以不同的方式设置线程。(线程设置为Daemon)。线程是在窗格构造函数中创建

  • 问题内容: 单击按钮后,它会更改其位置。 但是当我移动鼠标时,按钮又回到场景的中心,为什么呢? 我有以下代码: 问题答案: 建议的方法 对于您的特定代码段,也许使用Pane而不是StackPane是最好的方法。 为什么您的代码无法满足您的要求 如果要手动设置布局值,请不要使用会自动为您设置布局值的布局窗格(例如StackPane)。如果使用布局窗格,则下次布局窗格执行布局传递时(例如,调整其大小或

  • 我正在尝试构建一个在JavaFX中实现群聊的聊天应用程序。我想在边框窗格内创建一个滚动窗格,该窗格将包含用户所属的所有组。当用户加入时,需要将组图标(ImageViews)动态添加(在场景生成器中无法完成)到滚动窗格(在HBox内)。 目前,我正在使用一个SceneController类,该类负责所有阶段和场景更改。 我已经创建了一个FXML文件(使用场景生成器),其中包含一个边框窗格和一个滚动窗