从observableArrayList到ObservableArrayList <piechart.data> </piechart.data>

时间:2014-08-25 12:57:05

标签: java javafx

可能是我正在接近这个问题。但我想在不同的可视化类型中可视化我的tableview中的数据,例如PieChart和BarChart。

怎么能接近这个?我例如尝试在我的PieChart中使用我的observableArrayList,但我不能让它工作。

我目前有:

ObservableList data = FXCollections.observableArrayList();
ObservableList<PieChart.Data> dataList = FXCollections.observableArrayList();

关键是(以及我不使用数据类的原因)是因为用户应该能够选择在表视图中获得的数据并进行可视化。这就是我使用动态行和列的原因。

澄清:应用程序的要点是用户连接到数据库并选择他想要显示的数据。换句话说,用户在表视图中选择两列,然后单击饼图,然后我想要显示饼图。

1 个答案:

答案 0 :(得分:1)

PieChart中的数据需要两个属性:名称(String)和值(double)。 BarChart类似。

因此,假设您对List<String>中每行显示的数据使用某些任意数据结构(例如TableView),则需要存储用户对哪个列的选择数据的名称,以及具有值的数据。

对于TableView项目列表中的每个元素,您需要将item映射到new PieChart.Data(name, value),并使用这些元素填充ObservableList<PieChart.Data>传递给PieChart

int userChosenDataNameColumnIndex ;
int userChosenDataValueColumnIndex ;

// for each List<String> in the table's data:
List<String> rowData ;
String name = rowData.get(userChosenDataNameColumnIndex);
double value = Double.parseDouble(rowData.get(userChosenDataValueColumnIndex));
PieChart.Data pieChartData = new PieChart.Data(name, value);

您可以手动管理所有这些:

TableView<List<String>> table = new TableView<>();
ObservableList<List<String>> tableData = loadTableDataFromDatabase();
int userChosenDataNameColumnIndex ;
int userChosenDataValueColumnIndex ;

ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList();
for (List<String> rowData : tableData) {
    String name = rowData.get(userChosenDataNameColumnIndex);
    double value = Double.parseDouble(rowData.get(userChosenDataValueColumnIndex));
    pieChartData.add(new PieChart.Data(name, value));
}
PieChart pieChart = new PieChart(pieChartData);

请注意,这只是创建一个饼图,它是表中数据的快照。如果向表中添加行或从表中删除行,则饼图不会更新。您可以使用EasyBind框架创建ObservableList<PieChart.Data>,这是表格数据的“实时”视图:

TableView<List<String>> table = new TableView<>();
ObservableList<List<String>> tableData = loadTableDataFromDatabase();
int userChosenDataNameColumnIndex ;
int userChosenDataValueColumnIndex ;

ObservableList<PieChart.Data> pieChartData = EasyBind.map(tableData, rowData -> {
    String name = rowData.get(userChosenDataNameColumnIndex);
    double value = Double.parseDouble(rowData.get(userChosenDataValueColumnIndex));
    return new PieChart.Data(name, value);
});
PieChart pieChart = new PieChart(pieChartData);

ObservableList<XYChart.Data<String, Number>> barChartData = EasyBind.map(tableData, rowData -> {
    String name = rowData.get(userChosenDataNameColumnIndex);
    Double value = new Double(rowData.get(userChosenDataValueColumnIndex));
    return new XYChart.Data(name, value);
});
BarChart<String, Number> barChart = new BarChart<>(new CategoryAxis(), new NumberAxis(), barChartData)