在饼图中显示附加值

2023-12-11

我有这个饼图数据的示例:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.chart.PieChart.Data;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.effect.Glow;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class MainApp extends Application
{

    Stage stage;

    PieChart chart;
    ObservableList<Data> pieChartData = FXCollections.observableArrayList();
    Label caption;

    @Override
    public void start(Stage stage)
    {

        this.stage = stage;

        setUserAgentStylesheet(STYLESHEET_CASPIAN);
        Scene scene = new Scene(new Group());
        stage.setTitle("Imported Fruits");
        stage.setWidth(500);
        stage.setHeight(500);

        chart = new PieChart(pieChartData);
        chart.setTitle("Imported Fruits");

        // Add some data
        addPieChartData("Grapefruit", 13);
        addPieChartData("Oranges", 25);
        addPieChartData("Plums", 10);
        addPieChartData("Pears", 22);
        addPieChartData("Apples", 30);

        // Some task which updates the Pie Chart
        final Task task;
        task = new Task<Void>()
        {
            @Override
            protected Void call() throws Exception
            {
                int max = 50;
                int l = 0;
                for (int i = 1; i <= max; i++)
                {

                    updatePieChartData("Grapefruit", l++);
                    updatePieChartData("Oranges", l++);

                    Thread.sleep(600);
                }
                return null;
            }
        };

        new Thread(task).start();

        ((Group) scene.getRoot()).getChildren().addAll(chart, caption);
        stage.setScene(scene);
        stage.show();
    }

    public void addPieChartData(String name, double value)
    {
        pieChartData.add(new Data(name, value));

        caption = new Label();
        caption.setTextFill(Color.DARKORANGE);
        caption.setStyle("-fx-font: 24 arial;");

        for (final Data data : chart.getData())
        {

            Node node = data.getNode();

            node.addEventHandler(MouseEvent.MOUSE_MOVED, new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(MouseEvent e)
                {
                    caption.setTranslateX(e.getSceneX() + 15);
                    caption.setTranslateY(e.getSceneY());
                    caption.setText(String.valueOf(data.getPieValue()) + "%");
                    caption.setVisible(true);
                    node.setEffect(new Glow());
                    //String styleString = "-fx-border-color: white; -fx-border-width: 1; -fx-border-style: dashed;";
                    //node.setStyle(styleString);
                }
            });

            node.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(MouseEvent e)
                {
                    caption.setVisible(false);
                    node.setEffect(null);
                    //node.setStyle("");
                }
            });

            final MenuItem resizeItem = new MenuItem("Resize");
            resizeItem.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    System.out.println("Resize requested");
                }
            });

            final MenuItem aboutItem = new MenuItem("About");
            aboutItem.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    System.out.println("About requested");
                }
            });

            final MenuItem changeColorItem = new MenuItem("Change Color");
            changeColorItem.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    System.out.println("change Color Item requested");

                }
            });

            final ContextMenu menu = new ContextMenu(resizeItem, aboutItem, changeColorItem);

            node.setOnMouseClicked(new EventHandler<MouseEvent>()
            {
                @Override
                public void handle(MouseEvent event)
                {
                    if (MouseButton.SECONDARY.equals(event.getButton()))
                    {
                        menu.show(stage, event.getScreenX(), event.getScreenY());
                    }
                }
            });

        }
    }

    // updates existing Data-Object if name matches
    public void updatePieChartData(String name, double value)
    {
        for (Data d : pieChartData)
        {
            if (d.getName().equals(name))
            {
                d.setPieValue(value);
                return;
            }
        }
        addPieChartData(name, value);
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}

有没有类似于折线图中的tickLabelFormatter的方法来显示饼图名称中的附加值?

我想显示每个饼图切片的名称和编号。


只需将饼图数据名称绑定到所需的值即可。

pieChartData.forEach(data ->
        data.nameProperty().bind(
                Bindings.concat(
                        data.getName(), " ", data.pieValueProperty(), " Tons"
                )
        )
);

add info

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.chart.*;
import javafx.scene.Group;

public class PieChartSample extends Application {

    @Override public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Imported Fruits");
        stage.setWidth(500);
        stage.setHeight(500);

        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                new PieChart.Data("Grapefruit", 13),
                new PieChart.Data("Oranges", 25),
                new PieChart.Data("Plums", 10),
                new PieChart.Data("Pears", 22),
                new PieChart.Data("Apples", 30));
        final PieChart chart = new PieChart(pieChartData);
        chart.setTitle("Imported Fruits");

        pieChartData.forEach(data ->
                data.nameProperty().bind(
                        Bindings.concat(
                                data.getName(), " ", data.pieValueProperty(), " Tons"
                        )
                )
        );

        ((Group) scene.getRoot()).getChildren().add(chart);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在饼图中显示附加值 的相关文章

随机推荐

  • 如何使用 php 修剪所有前导/尾随
    代码

    我正在尝试删除所有前导和尾随 br 使用 PHP 在字符串中 这是一个例子 br br Hello br World br p This is a message br p br br br br 我想回来 Hello br World b
  • C 中按值调用和按引用调用如何工作?

    在 C 程序中 按值调用函数如何工作 按引用调用如何工作 以及如何返回值 按值调用 void foo int c c 5 5 is assigned to a copy of c 像这样称呼它 int c 4 foo c c is stil
  • 为什么使用输入组会破坏引导程序中的基线对齐?

    如果我有一个表单 输入旁边有一个标签 采用纯 HTML 并且两者都是内联 或内联块 那么它们将按基线对齐 但是 当使用引导程序并将输入放入输入组时 它们似乎按底部对齐 我尝试在没有引导程序的情况下复制它 但我做不到 它只是有效 我创建了小提
  • 如何使用充满测试用例的输入文件来测试 Python 脚本?

    我正在参加在线法官竞赛 我想使用充满测试用例的 in 文件来测试我的代码 以对我的算法进行计时 如何让我的脚本从此 in 文件获取输入 所以脚本通常从 stdin 获取测试用例 现在您想使用文件中的测试用例进行测试 如果是这种情况 请使用
  • Oracle SQL-Loader 有效处理值中的内部双引号

    我遇到了一些 Oracle SQL Loader 挑战 正在寻找一种高效且简单的解决方案 我要加载的源文件是管道 分隔 其中值用双引号括起来 问题似乎是某些值包含内部双引号 e g a b 这导致我的记录被拒绝 理由是 no termina
  • 辅助服务的“onAccessibilityEvent”函数未被调用

    我正在开发的应用程序遇到了一个相当不幸的问题 该应用程序利用辅助功能服务在通知到达用户设备时对通知进行一些特殊处理 问题是 它工作得很好 但服务的 onAccessibilityEvent 函数从未被调用unless该服务是从 Androi
  • Karate-有什么不丑陋的方式来发送每个请求主体字段都包含格式错误的 API 请求吗?

    我有一个奇怪的问题 我已经有了解决方案 但它非常丑陋 我想知道是否有更好的方法通过空手道或 JS 来做到这一点 我对这两方面都是新手 所以请耐心等待 我正在发送一个带有相当大的请求正文 总共 19 个字段 的 POST 调用 我必须有目的地
  • 嵌套 if 在 php 中不起作用要么不执行任何操作,要么转到代码末尾

    几个小时以来 我一直对这段代码感到沮丧 我只能低头寻求一些帮助 我试图让这些嵌套的 if 工作 但它要么不返回任何内容并且我没有收到任何错误 要么它会到达编码的末尾 它应该事先停止 这些输入均来自组单选按钮 其顺序的原因是 一旦到达正在调用
  • 访问 Vue JS 实例监视对象中的 $refs 数组

    我正在构建一个Vue JSSPA 还有Vuetify 数据表在 v app 内部 我试图在里面设置一个变量观察对象为了FilteredItems 计算属性在数据表内 但我不确定如何访问 refs数组实例内部 我知道可以通过以下方式在实例中访
  • 浮点数的精度

    Python 中的浮点数的精度是多少 它总是双精度还是特定于实现或平台 例如 CPython 和 PyPy 有何不同 From Python文档 浮点数通常使用以下方式实现C 中的双倍 有关的信息精确和内部代表 程序所在机器的浮点数 运行可
  • 捕获已达到 set_time_limit() - PHP [重复]

    这个问题在这里已经有答案了 可能的重复 如何捕获致命错误 PHP 超出最大执行时间 30 秒 我用过set time limit 60 之前很多次 但是 当超过这个值时 是否还有捕获 目前它只是以同样的旧错误进行轰炸 我想捕获它失败然后用我
  • 如何为特定部分固定配方蛋的版本

    我在构建中添加了一个部分来安装 python ldap 如下所述 http bluedynamics com articles jens python ldap as egg with buildout 然而我的构建失败了 While In
  • Service Fabric 中的应用程序洞察?

    我需要在我正在开发的 Azure Service Fabric 应用程序中添加性能日志记录 我尝试遵循以下指南 该指南看起来非常简单明了 https github com Microsoft azure content blob maste
  • 查询嵌套表

    我正在尝试查询NESTED TABLE using PL SQL 几个消息来源告诉我这是可能的 但我不断收到错误消息 ORA 21700 对象不存在或已标记为删除 我不明白为什么它不让我这样做 我已经确定dados变量中有内容 我输出它 c
  • Java比较字符串与正则表达式 - while循环

    我希望用户输入一个字符串 如果该字符串与我的正则表达式不匹配 那么我希望输出一条消息 并且用户再次输入一个值 问题是 即使字符串与正则表达式匹配 它也会将其视为不匹配 我的正则表达式 这应该等于 Name Name A Z a zA Z s
  • 单击复选框数据动态保存到数据库

    当我选中复选框时 我需要一些 js ajax jquery 脚本将数据动态保存到数据库 此时的复选框或加载到记录旁边 并根据是否选中来更改数据库中的变量 但是在我选择一个将其保存到数据库后 我必须重新加载页面 我可以做其他所有事情 但了解如
  • 如何在 React JSX 中使用“< >”

    如何在 React 中使用 作为文本 我想将它用于我的投资组合 你需要使用HTML 实体 HTML 中的保留字符必须替换为字符实体 Result Description Entity Name Entity Number lt less t
  • Kivy:如何将复选框设置为在启动时选中

    如何将 id 设置为蓝色的复选框的状态设置为在启动时检查 我使用 python 3 6 和 Kivy 1 9 2 dev0 我以为线条blue ObjectProperty True in py and value root blue in
  • jQuery 滑块范围:将范围应用为表行的过滤器

    在我的实习中 我必须为表格创建一个过滤器 该过滤器必须仅显示您给定的值之间的行 我使用 jQuery UIrange slider我有一个普通的 HTML 表格 我无法让它工作 我尝试了很多不同的事情 这是我的代码 function sli
  • 在饼图中显示附加值

    我有这个饼图数据的示例 import javafx application Application import javafx collections FXCollections import javafx collections Obse