实现数据与视图双向绑定功能

  1. java实现数据编辑控件,要求能编辑json数据
  2. 实现数据可视化图形展示。如饼状图,柱状图等
  3. 实现当数据发生修改时,自动更新数据视图
  4. 数据展示图能进行鼠标拖动修改,图像修改自动修改对应数据。
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);
    }
}

运行结果如下:

点击饼图可以增加数据修改饼图,也可以通过文本框修改饼图数据 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值