来自 URL json 的 JavaFX 动态 TableView

JavaFX Dynamic TableView from URL json

我想创建一个动态 table 视图,它从网页提供的 json 获取数据。问题是,只要来自 json 的数据超出范围(例如范围应该是 0.8 - 0.9,但它显示为 1.1),table 会自动用 [=17 更新 observablelist =] 图片。如果数据在范围内,则显示 "BLUE 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 中,以便它始终更新。我怎样才能在 table 中动态显示泵站点旁边的蓝色或红色方块?

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

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

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

private SimpleBooleanProperty status;

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

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 形状 class )而不是复选框。

(2)一个java.util.TimerTimerTaskclasses可以用来定期调度和运行一个任务.在构建 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);
    }
    //...
}

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

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