【问题标题】:ListView.refresh() does not workListView.refresh() 不起作用
【发布时间】:2017-02-27 15:54:26
【问题描述】:

不知何故,虽然在 JavaDoc 中有说明,但方法 refresh() 对我不起作用,只能通过再次调用 setItems() 来进行,这需要很多时间,尤其是当关联的 ObservableList 很长时,对我有用。这是我的源代码:

NetworkManager 类,getStations() 方法

ObservableList<Station> getStations() {
        ObservableList<Station> stations = FXCollections.observableArrayList();
        JsonArray jsonArray = getRootElement().getAsJsonObject().getAsJsonArray("stations");
        for(JsonElement currentElement : jsonArray) {
            stations.add(gson.fromJson(currentElement, Station.class));
        }
        return stations;
}

然后我在我的 JavaFX 初始化方法中建立 ListView 和这个方法之间的连接:

listView.setItems(networkManager.getStations());

现在,如果我注册一个新的 Station 对象并使用

listView.refresh();

ListView 不会刷新,只有这个有效:

listView.setItems(networkManager.getStations());

这里有什么问题?

肯塔1561

编辑: 我的应用程序类扩展主类:

package de.kenta1561.enr.main.java;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.TabPane;
import javafx.stage.FileChooser;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.Window;

import java.io.File;
import java.io.IOException;

public class EasyNetworkRegistration extends Application {

private File file;
private Controller controller;

private boolean fileCreated;

@Override
public void start(Stage primaryStage) throws Exception {
    showFileChooser(primaryStage);
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/de/kenta1561/enr/main/resources/EasyNetworkRegistration.fxml"));
    TabPane pane = loader.load();
    controller = loader.getController();
    initializeController();
    Scene scene = new Scene(pane);
    primaryStage.setScene(scene);
    primaryStage.setTitle("EasyNetworkRegistration");
    primaryStage.show();
    setCenter(primaryStage);
}

如何将电台添加到我的 JSON 文件中:

void addStation(Station station) {
        JsonObject rootObject = getRootElement().getAsJsonObject();
        JsonArray jsonArray = rootObject.getAsJsonArray("stations");
        jsonArray.add(gson.toJsonTree(station));
        writeToFile(rootObject);
}

PS:显然 refresh() 方法是在调用此方法之后调用的,所以我认为这不应该是问题。

【问题讨论】:

  • 很大的帮助是在这里查看您的应用程序扩展类,看看它是如何完成的
  • 你是如何添加新项目的?
  • 如果我是正确的,您首先将电台添加到 JSON 中,然后使用 getStations() 读取它?你需要更新 observableList 让听众知道发生了什么变化 - @James_D 已经回答了我的 +1
  • 顺便说一句:永远不要使用刷新 - 即使它看起来可以工作,它也很有可能在你的更新代码中隐藏了一些问题

标签: java listview javafx gson


【解决方案1】:

您的 addStation 方法唯一要做的就是更新 JSON 文件。桌子不可能知道任何事情都发生了变化。对refresh() 的调用只是从同一个ObservableList 重新加载数据,同样,您没有更改。

考虑将新站直接添加到可观察列表中:

void addStation(Station station) {
        JsonObject rootObject = getRootElement().getAsJsonObject();
        JsonArray jsonArray = rootObject.getAsJsonArray("stations");
        jsonArray.add(gson.toJsonTree(station));
        writeToFile(rootObject);
        listView.getItems().add(station);
}

(如果addStation 不在您的控制器中,请以明显的方式重构它。)

应该没有必要打电话给refresh()

【讨论】:

  • 非常感谢 :D 为什么我没有想到这种方法
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多