在JavaFX 2中将2个表视图和折线图绑定在一起

时间:2012-06-13 03:52:12

标签: tableview javafx-2

我的要求是使用2个表和1个图表来可视化我的数据集。每个数据元素都包含其(唯一)名称和属于它的一组数据。第一个表将显示我拥有的每个数据集的名称,第二个表将显示属于第一个表中所选数据集(行)的数据。第二个表和图表将显示相同的数据,并且都属于在第一个表中选择的数据集(行)。我现在通过使用下面的代码实现了这种行为的一半(链接两个表)。

我现在遇到的问题是:我无法弄清楚让图表显示与第二个表相同的数据的方法。我的想法是在ChangeListener中设置图表数据,但问题是表的数据模型可能不适合图表。我在TableDataModel类中有readingData字段作为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, ...);

TableDataModel.java:

private final SimpleStringProperty name;
// Other SimpleStringProperty and its get and set method omitted

public final ObservableList<ReadData> readingData = FXCollections.observableArrayList();

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

1 个答案:

答案 0 :(得分:0)

AFAIK您需要先将XYChart.Data放入XYChart.Series,然后按chart.getData().add(series)将该系列放入图表中。我认为你可以在myTable选择的更改监听器中执行此操作:在那里创建一个新系列(或修改现有的,先前创建的和添加的系列),添加value.get()中的所有ReadData值。请参阅example of LineChart