我的要求是使用 2 个表格和 1 个图表来可视化我的数据集。每个数据元素都包含其(唯一)名称和一组属于它的数据。第一个表将显示我拥有的每个数据集的名称,第二个表将显示属于在第一个表中选择的数据集(行)的数据。第二个表和图表将显示相同的数据,并且都属于在第一个表中选择的数据集(行)。通过使用下面的代码,我现在已经实现了一半的这种行为(链接两个表)。
我现在遇到的问题是:我想不出办法让图表显示与第二张表相同的数据。我的想法是在ChangeListener中设置图表数据,但问题是表格的数据模型很可能不适合图表。我readingData
在 TableDataModel 类中有字段为 ObservableList,这是图表接受的类型,但它是 ReadingData 的 ObservableList 而不是 XYChart.Data。有什么方法可以在 ReadData 类中使用 XYChart.Data 吗?
我的主要课程:
ObservableList<TableDataModel> tableData = FXCollections.observableArrayList();
// Other code omitted
/* Create the first table */
TableView<TableDataModel> myTable = new TableView<TableDataModel>();
TableColumn nameColumn = new TableColumn("Name");
nameColumn.setCellValueFactory(new PropertyValueFactory<TableDataModel, String>("name"));
// Other column omitted
myTable.setItems(tableData);
myTable.getColumns().addAll(nameColumn, ...);
// When user select on any row update the second table items
myTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TableDataModel>()
{
@Override
public void changed(ObservableValue<? extends TableDataModel> arg0, TableDataModel arg1, TableDataModel arg2)
{
dataTable.setItems(arg2.readingData);
}
});
/* The second table */
TableView<ReadData> dataTable = new TableView<ReadData>();
TableColumn valueColumn = new TableColumn("Value");
valueColumn.setCellValueFactory(new PropertyValueFactory<ReadData, Integer>("value"));
// Other column omitted
dataTable.setItems(null);
dataTable.getColumns().addAll(valueColumn, ...);
表数据模型.java:
private final SimpleStringProperty name;
// Other SimpleStringProperty and its get and set method omitted
public final ObservableList<ReadData> readingData = FXCollections.observableArrayList();
读取数据.java:
// I use XYChart.Data here because I think that this might be useful when I want to show this on the chart
private SimpleObjectProperty<XYChart.Data<Integer, Integer>> value;
// Other property
// Provide this to make below line work
// valueColumn.setCellValueFactory(new PropertyValueFactory<ReadData, Integer>("value"));
public int getValue()
{
return value.get().getYValue();
}