【问题标题】:JavaFX Dynamic TableView from URL json来自 URL json 的 JavaFX Dynamic TableView
【发布时间】:2018-08-30 02:22:16
【问题描述】:

我想创建一个动态表格视图,它从网页提供的 json 中获取其数据。问题是,每当来自 json 的数据超出范围时(例如,范围应该是 0.8 - 0.9,但它读取的是 1.1),表会自动使用“RED SQUARE”图像更新可观察列表。如果数据在范围内,则会显示“蓝色正方形”图像。它就像一个状态指示器,让用户知道数据是否正确。我有这个代码:

public ObservableList<PumpSites> list = FXCollections.observableArrayList(
        new PumpSites (blue or red square image, "Canduman"),
        new PumpSites (blue or red square image, "Cubacub"),
        new PumpSites (blue or red square image, "Liloan"),
        new PumpSites (blue or red square image, "Talamban"),
        new PumpSites (blue or red square image, "Tisa")
        );

status.setCellValueFactory(new PropertyValueFactory<PumpSites, String>("status"));
ps.setCellValueFactory(new PropertyValueFactory<PumpSites, String>("ps"));
table.setItems(list);

public class PumpSites {
private final SimpleStringProperty status;
private final SimpleStringProperty ps;

public PumpSites(String status, String ps){
    super();
    this.status = new SimpleStringProperty(status);
    this.ps = new SimpleStringProperty(ps);
}

public String getStatus() {
    return status.get();
}

public String getPs() {
    return ps.get();
}

}

我从 json 获取数据没有问题。我计划将状态指示器的动态数据读取放在 platform.runlater 中,以便它始终更新。如何在表格中动态显示泵站点旁边的蓝色或红色方块?

【问题讨论】:

  • 您是问如何定期自动刷新数据,或者如何随着数据的变化更新方块?
  • 我知道如何使用platform.runlater,但是我不知道如何更新表的数据。我也不知道如何添加方形图像。
  • 您的问题对于本网站来说可能过于宽泛(您似乎至少有 2-3 个一般性问题)。
  • 但是,我会使用javafx.concurrent.ScheduledService 定期从远程源提取数据。然后,您可以完全替换 TableView 中的项目或刷新任何现有数据,同时添加新数据并删除不再存在的数据。要自定义 TableColumnTableCells,您可以使用 cellFactory。对于值的有效性,在PumpSites 中有一个ReadOnlyBooleanProperty 也可能是有益的。将方块留给 UI(即TableCells)。您还应该考虑使用绑定。
  • 请提供一个minimal reproducible example 来说明问题。

标签: java javafx javafx-8


【解决方案1】:

以下是一些想法和代码示例:

(1) 为表格视图的列单元格呈现状态(是或否) - 示例代码:

DataClass 可以有一个 boolean 属性,定义如下:

private SimpleBooleanProperty status;

表格视图的单元格可以通过使用状态的布尔属性值的复选框来呈现。下面是如何定义表格视图的列的代码:

TableColumn<DataClass, Boolean> statusCol = new TableColumn<>("Status");
statusCol.setCellValueFactory(new PropertyValueFactory<DataClass, Boolean>("priority"));
statusCol.setCellFactory(column -> {
    CheckBoxTableCell<DataClass, Boolean> cell = new CheckBoxTableCell<>();
    cell.setAlignment(Pos.CENTER);
    return cell;
});

正如我已经建议的那样,可以呈现一个彩色框(使用来自javafx.scene.shape 包的Rectangle 之类的形状类)而不是复选框。

(2) java.util.TimerTimerTask 类可用于定期调度和运行任务。在构建 gui 后的主应用程序中,可以按如下方式初始化计时器:

public class BuildMyAppGui {
    //...
    private void initiateTimer() {

            Timer timer = new Timer();
            long zeroDelay = 0L;
            long period = 60000L; // 60 * 1000 = 1 min

            // The timer runs once the first time
            // and subsequently the scheduled task every one minute
            timer.schedule(new DataChangedTask(), zeroDelay, period);
    }
    //...
}

定时器的任务类示例代码:

public class DataChangedTask extends TimerTask {

    @Override
    public void run() {
        // Code checks if there is a data change and refreshes the table data.
        // This also refreshes the table column with check box -
        // as checked or un-checked depending on the true/false value
        // in the boolean property in DataClass.
    }
}

请注意,DataChangedTask 类可以让构造函数获取对数据的引用,并根据应用的要求访问其他引用。

【讨论】:

  • 您能简单地说一下您是如何解决的(解决方案帖子或建议的哪些方面有所帮助)?
  • 好吧,这个问题不是很清楚——难怪答案不是很具体;)关于使用 java.util 包中的 Timer/Task:最好不要——它会留下所有的负担在代码的 fx-app 线程上正确更新(您至少应该提及)。相反,请使用时间轴。
  • @kleopatra A Timeline 适用于需要在 FX 线程上执行的周期性任务,但不适用于需要在后台线程上执行周期性任务时。 OP 似乎需要更新来自远程源的数据,这些数据应该在后台线程上检索。这就是我在评论中建议ScheduledService 的原因;它基本上是一个单任务Timer,但会为您处理与 FX 线程的通信(以及其他功能)。
猜你喜欢
  • 2014-05-19
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2013-05-19
  • 2021-03-11
  • 1970-01-01
相关资源
最近更新 更多