- java实现数据编辑控件,要求能编辑json数据
- 实现数据可视化图形展示。如饼状图,柱状图等
- 实现当数据发生修改时,自动更新数据视图
- 数据展示图能进行鼠标拖动修改,图像修改自动修改对应数据。
package org.example; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.control.TextArea; import javafx.scene.input.MouseButton; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.util.Optional; import java.util.stream.StreamSupport; public class Main extends Application { public StringProperty jsonData = new SimpleStringProperty(); public PieChart pieChart = new PieChart(); public ObservableList<PieChart.Data> data; @Override public void start(Stage primaryStage) { // 数据编辑控件 TextArea textArea = new TextArea(); //创建数据 data = FXCollections.observableArrayList( new PieChart.Data("A", 30), new PieChart.Data("B", 20), new PieChart.Data("C", 25) ); //给图形添加数据,数据可视化图形展示 pieChart.setData(data); pieChart.setTitle("数据可视化"); //将数据转为json格式,并存在文本框中 jsonData.setValue(toJson(data)); textArea.textProperty().bindBidirectional(jsonData); //文本监听事件 textArea.textProperty().addListener((observable, oldValue, newValue) -> { try { // 将文本框中的 JSON 数据转换为 PieChart 的数据项 JsonArray newData = JsonParser.parseString(newValue).getAsJsonArray(); // 处理饼图中的每个数据项 for (PieChart.Data dataItem : pieChart.getData()) { String name = dataItem.getName(); // 查找具有相同名称的数据项 Optional<JsonElement> optionalJsonData = StreamSupport.stream(newData.spliterator(), false) .filter(element -> element.getAsJsonObject().get("name").getAsString().equals(name)) .findFirst(); if (optionalJsonData.isPresent()) { // 如果找到了匹配项,则更新其值 double value = optionalJsonData.get().getAsJsonObject().get("value").getAsDouble(); if (value == 0) { // 如果值为 0,则从饼图中删除该数据项 pieChart.getData().remove(dataItem); } else { dataItem.setPieValue(value); } } else { // 如果没有找到匹配项,则删除该数据项 pieChart.getData().remove(dataItem); } } // 处理新增的数据项 for (JsonElement element : newData) { JsonObject object = element.getAsJsonObject(); String name = object.get("name").getAsString(); double value = object.get("value").getAsDouble(); Optional<PieChart.Data> optionalData = pieChart.getData().stream() .filter(dataItem -> dataItem.getName().equals(name)) .findFirst(); if (optionalData.isPresent()) { // 如果找到了匹配项,则已经在前面的循环中处理了,无需再次处理 continue; } if (value > 0) { // 如果值不为 0,则添加新的数据项 pieChart.getData().add(new PieChart.Data(name, value)); pieChart.setData(pieChart.getData()); textArea.setText(toJson(data)); for (PieChart.Data dataItem : pieChart.getData()) { dataItem.pieValueProperty().addListener((observable1, oldValue1, newValue1) -> { // 更新 JSON 字符串,并将其重新绑定到 TextArea 的文本属性 // jsonData.set(toJson(data)); // 更新 TextArea 显示的文本 pieChart.setData(data); textArea.setText(toJson(data)); System.out.println("注册数据项改变监听器00"+textArea.getText()); }); for (PieChart.Data dataItem1 : pieChart.getData()) { // 为每个 数据项 创建一个新的 Node 对象 dataItem1.getNode().setOnMouseClicked(event -> { if (event.getButton() == MouseButton.PRIMARY) { dataItem1.setPieValue(dataItem1.getPieValue() + 1); } }); } } } } } catch (Exception e) { // 捕获解析异常 System.err.println("Invalid JSON format: " + newValue); } }); // 注册数据项改变监听器,当数据改变时更新 JSON 字符串 for (PieChart.Data dataItem : pieChart.getData()) { dataItem.pieValueProperty().addListener((observable, oldValue, newValue) -> { // 更新 JSON 字符串,并将其重新绑定到 TextArea 的文本属性 // jsonData.set(toJson(data)); // 更新 TextArea 显示的文本 pieChart.setData(data); textArea.setText(toJson(data)); System.out.println("数据改变"+textArea.getText()); }); } //单击事件 for (PieChart.Data dataItem : pieChart.getData()) { // 为每个 数据项 创建一个新的 Node 对象 dataItem.getNode().setOnMouseClicked(event -> { if (event.getButton() == MouseButton.PRIMARY) { dataItem.setPieValue(dataItem.getPieValue() + 1); } }); } VBox vBox = new VBox(pieChart, textArea); Scene scene = new Scene(vBox, 700, 500); System.out.println("默认图像"); primaryStage.setScene(scene); primaryStage.show(); } public static String toJson(ObservableList<PieChart.Data> data) { JsonArray jsonArray = new JsonArray(); for (PieChart.Data item : data) { JsonObject object = new JsonObject(); object.addProperty("name", item.getName()); object.addProperty("value", item.getPieValue()); jsonArray.add(object); } return jsonArray.toString(); } public static void main(String[] args) { launch(args); } }
运行结果如下:
点击饼图可以增加数据修改饼图,也可以通过文本框修改饼图数据