来自URL json的JavaFX Dynamic TableView

问题描述 投票:-1回答:1

我想创建一个动态的tableview,它从网页提供的json中获取数据。问题是,只要来自json的数据超出范围(例如范围应该是0.8-0.9,但它读取1.1),该表会自动使用“RED SQUARE”图像更新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中动态读取状态指示器的数据,以便它始终更新。如何动态地在表格中的泵站点旁边显示蓝色或红色方块?

java javafx javafx-8
1个回答
0
投票

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

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

DataClass可以有一个像这样定义的boolean属性:

private SimpleBooleanProperty status;

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

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

正如我已经建议使用彩色框(使用像Rectangle包中的javafx.scene.shape这样的形状类)而不是复选框。

(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类可以让构造函数接受数据引用并访问应用程序所需的其他引用。

© www.soinside.com 2019 - 2024. All rights reserved.