可能是我正在接近这个问题。但我想在不同的可视化类型中可视化我的tableview中的数据,例如PieChart和BarChart。
怎么能接近这个?我例如尝试在我的PieChart中使用我的observableArrayList,但我不能让它工作。
我目前有:
ObservableList data = FXCollections.observableArrayList();
ObservableList<PieChart.Data> dataList = FXCollections.observableArrayList();
关键是(以及我不使用数据类的原因)是因为用户应该能够选择在表视图中获得的数据并进行可视化。这就是我使用动态行和列的原因。
澄清:应用程序的要点是用户连接到数据库并选择他想要显示的数据。换句话说,用户在表视图中选择两列,然后单击饼图,然后我想要显示饼图。
答案 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)