来自URL json的JavaFX动态表视图

来自URL json的JavaFX动态表视图,java,javafx,javafx-8,Java,Javafx,Javafx 8,我想创建一个动态tableview,它从网页提供的json获取数据。问题是,只要json中的数据超出范围(例如,范围应为0.8-0.9,但读数为1.1),表就会自动用“红方块”图像更新observablelist。如果数据在范围内,则显示“蓝色方形”图像。它就像一个状态指示器,让用户知道数据是否正确。我有以下代码: public ObservableList<PumpSites> list = FXCollections.observableArrayList( ne

我想创建一个动态tableview,它从网页提供的json获取数据。问题是,只要json中的数据超出范围(例如,范围应为0.8-0.9,但读数为1.1),表就会自动用“红方块”图像更新observablelist。如果数据在范围内,则显示“蓝色方形”图像。它就像一个状态指示器,让用户知道数据是否正确。我有以下代码:

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

}
公共ObservableList=FXCollections.observableArrayList( 新泵辉石(蓝色或红色方形图像,“Canduman”), 新泵辉石(蓝色或红色方形图像,“Cubacub”), 新泵辉石(蓝色或红色方形图像,“Liloan”), 新泵辉石(蓝色或红色方形图像,“Talamban”), 新泵辉石(蓝色或红色方形图像,“Tisa”) ); status.setCellValueFactory(新属性ValueFactory(“status”); ps.setCellValueFactory(新财产价值工厂(“ps”); 表2.设置项目(列表); 公共类泵辉石{ 私人最终财产状况; 私人最终财产; 公用水泵站(串状态,串ps){ 超级(); this.status=新的SimpleStringProperty(状态); this.ps=新的SimpleStringProperty(ps); } 公共字符串getStatus(){ 返回状态。get(); } 公共字符串getPs(){ 返回ps.get(); } }
我从json获取数据没有问题。我计划将状态指示器的数据动态读取放在platform.runlater中,以便它始终更新。如何在表中动态显示泵位置旁边的蓝色或红色正方形?

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

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

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.
    }
}
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;
});
计时器的任务类示例代码:

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
类可以让构造函数引用数据,并根据应用程序的要求访问其他引用。

您是在询问如何定期自动刷新数据,还是在数据更改时更新正方形?我知道如何使用platform.runlater,但我不知道如何更新表中的数据。我也不知道如何添加方形图像。你的问题对于这个网站来说可能太广泛了(你似乎至少有2-3个一般性问题)。但是,我会使用
javafx.concurrent.ScheduledService
定期从远程源提取数据。然后,您可以完全替换
表视图中的项目,或者在添加新数据和删除不再存在的数据时刷新任何现有数据。要自定义
TableColumn
TableCell
s,可以使用
cellFactory
。在
PumpSites
中设置一个
ReadOnlyBooleanProperty
也可能有益于该值的有效性。将正方形留给UI(即
TableCell
s)。您还应该研究如何使用绑定。请提供一个演示该问题的示例。您能否简要说明您是如何解决的(解决方案帖子或建议的哪些方面有帮助)?嗯,问题不是很清楚-难怪答案不是很具体;)至于使用java.util包中的计时器/任务:最好不要这样做——它将为您的代码上的fx应用程序线程(您至少应该提到)的正确更新留下所有负担。相反,使用时间线。@kleopatra a
Timeline
非常适合需要在FX线程上执行的定期任务,但不适合在需要在后台线程上执行定期任务时使用。OP似乎需要更新来自远程源的数据,这些数据应该在后台线程上检索。这就是为什么我在评论中建议使用
ScheduledService
;它基本上是一个单一任务
计时器
,但为您处理与FX线程的通信(以及其他功能)。