可能是我正在解决这个问题。

如何解决?例如,我尝试在PieChart中使用我的observableArrayList,但无法正常工作。

我目前有:

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


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

需要说明的是:应用程序的要点是让用户连接到数据库并选择要可视化的数据。因此,换句话说,用户在表视图中选择例如两列,然后单击饼图,然后我希望该饼图出现。

最佳答案

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)

10-08 11:49