使用Properties保存并加载JavaFX TableView

时间:2017-08-14 18:49:35

标签: java javafx tableview properties-file

有没有一个像样的方法呢?我使用枚举填充TableView并使用其getters向列添加值,如下所示:

taskColumn.setCellValueFactory(a -> new SimpleStringProperty(a.getValue().getAssignmentName()));

tableView.getItems().addAll(Tasks.values());

我有很多可编辑的行,用户可以更改这些行来自定义程序的工作方式,但每次启动程序时这样做都会非常繁琐。

我想要做的是从列中获取所有值并使用java.util.Properties保存它们,然后我可以将其加载到TableView中,这样用户下次无需重新配置程序推出。

我必须使用属性进行此特定任务,但我对如何使这更简单的任何建议持开放态度。

2 个答案:

答案 0 :(得分:0)

可能的解决方案之一是使用CSV格式来保存用户数据。 这是CSV work的一个例子。

其他想法是JSON序列化/反序列化。

正如@James_D已经提到的,你需要一些项目细节。

答案 1 :(得分:0)

我说我会发布解决方案,如果我设法让它工作,这就是我个人使用的。我使用Json和Properties来保存和加载。完全接受建议和批评!我现在以传统方式填充tableview,而不是直接使用枚举。这对我想要完成的事情来说是糟糕的设计。感谢@James_D的建议。

private EventHandler<ActionEvent> saveSettings() {
    return event -> {
        JsonArray array = new JsonArray();
        JsonArray tasks = new JsonArray();
        for (int i = 0; i < tableView.getItems().size(); i++) {
            JsonObject task = new JsonObject();
            ObservableList<Info> info = tableView.getItems();
            task.addProperty("Name", info.get(i).getName());
            task.addProperty("Assignment", info.get(i).getAssignment());
            task.addProperty("Skip", info.get(i).isSkip());
            task.addProperty("Bar", info.get(i).getBar());
            tasks.add(task);
        }
        array.add(tasks);
        properties.setProperty("Settings", array.toString());
    };
}

private EventHandler<ActionEvent> loadSettings() {
    return event -> {
        String settings = properties.getProperty("Settings");
        if (settings != null) {
            tableView.getItems().clear();
            JsonParser parser = new JsonParser();
            JsonArray array = parser.parse(settings).getAsJsonArray();
            JsonArray tasks = array.get(0).getAsJsonArray();
            for (int i = 0; i < tasks.size(); i++) {
                JsonObject task = tasks.get(i).getAsJsonObject();
                tableView.getItems().add(new Info(task.get("Name").getAsString(), getAssignment(task.get("Assignment").getAsString()),
                        task.get("Skip").getAsBoolean(), task.get("Bar").getAsInt()));
            }
        }
    };
}