JavaFX PieChart已存在数据更新需求:点击添加按钮合并重复项
JavaFX PieChart 合并同名项数值解决方案
要实现点击添加按钮时合并同名项的数值,只需修改btnAdd()方法的逻辑:先检查现有数据中是否存在同名项,存在则累加数值,不存在再新增项。同时建议加上输入校验,避免非数字输入导致程序崩溃。
修改后的完整代码如下:
package charts; import java.net.URL; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.chart.PieChart; import javafx.scene.control.TextField; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; public class PieChartController implements Initializable { @FXML private TextField name, value; @FXML private PieChart pieChart; private ObservableList<PieChart.Data> data; @Override public void initialize(URL url, ResourceBundle rb) { data = FXCollections.observableArrayList(); pieChart.setData(data); } @FXML private void btnAdd() { String itemName = name.getText().trim(); String valueStr = value.getText().trim(); // 输入校验:名称和数值不能为空,且数值必须是正整数 if (itemName.isEmpty() || valueStr.isEmpty()) { showAlert("输入错误", "名称和数值不能为空"); return; } int addValue; try { addValue = Integer.parseInt(valueStr); if (addValue <= 0) { showAlert("输入错误", "数值必须大于0"); return; } } catch (NumberFormatException e) { showAlert("输入错误", "请输入有效的整数数值"); return; } // 查找是否存在同名项 boolean found = false; for (PieChart.Data item : data) { if (item.getName().equals(itemName)) { // 累加数值,PieChart.Data的pieValue是可观察属性,修改后图表自动刷新 item.setPieValue(item.getPieValue() + addValue); found = true; break; } } // 未找到同名项则新增 if (!found) { data.add(new PieChart.Data(itemName, addValue)); } // 清空输入框,优化操作体验 name.clear(); value.clear(); } // 弹窗提示辅助方法 private void showAlert(String title, String message) { Alert alert = new Alert(AlertType.WARNING); alert.setTitle(title); alert.setHeaderText(null); alert.setContentText(message); alert.showAndWait(); } }
关键逻辑说明:
- 输入校验:先过滤空输入,再校验数值格式,避免非法输入导致程序异常
- 同名项匹配:遍历现有数据列表,通过
getName()匹配项名称 - 自动刷新图表:
PieChart.Data的pieValue是可观察属性,调用setPieValue()更新后图表会自动同步,无需重复调用pieChart.setData(data) - 用户体验优化:操作完成后清空输入框,添加错误提示弹窗
内容的提问来源于stack exchange,提问作者Dani Alber
相关产品推荐
相关产品推荐

