可能是我正在解决这个问题。
如何解决?例如,我尝试在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)