`
hanxi003
  • 浏览: 1475 次
社区版块
存档分类
最新评论

javafx饼图特效

阅读更多

功能说明:

1、当鼠标移入饼图块时,该块位置发生偏移。

2、鼠标离开后,该块回复到原来位置。

先看效果图:
piechart
实现技巧: 1、计算鼠标所在块的偏移角度。 从上图中可以看出:在javafx中,第一个数据块的位置从0开始,按逆时针方向一次排列。 因此数据块的偏移角度为,它之前所有数据块的角度之和,再加上本身所占角度的一半。
2、数据块角度的计算。 可以根据数据块所占数据的百分比计算对应的角度。 参考以下代码:
    private static double calcAngle(PieChart.Data d) {
            double total = 0;
        for (PieChart.Data tmp : d.getChart().getData()) {
            total += tmp.getPieValue();
        }
        return 360 * (d.getPieValue() / total);
    }

3、注意y坐标的计算,由于fx的y轴和直角坐标系相反,所以移动y坐标要取反。

全部源码:

public class PieChartSample extends Application {

    @Override
    public void start(Stage primaryStage) {
        BorderPane p = new BorderPane();

        ObservableList pieChartData = FXCollections
                .observableArrayList(new PieChart.Data("Austria", 8_430_558),
                        new PieChart.Data("Swiss", 7_701_900),
                        new PieChart.Data("Germany", 81_882_342),
                        new PieChart.Data("France", 62_793_432),
                        new PieChart.Data("Spain", 46_661_950),
                        new PieChart.Data("Italy", 60_245_846));
        PieChart chart = new PieChart(pieChartData);
        // chart.setStyle("-fx-pie-label-visible: false");

        for (PieChart.Data d : pieChartData) {
            d.getNode().setOnMouseEntered(new MouseHoverAnimation(d, chart));
            d.getNode().setOnMouseExited(new MouseExitAnimation());
        }

        chart.setClockwise(false);
        p.setCenter(chart);

        Scene s = new Scene(p);
        primaryStage.setScene(s);
        primaryStage.setWidth(600);
        primaryStage.setHeight(600);
        primaryStage.setTitle("动态饼图");
        primaryStage.show();
    }

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

    static class MouseHoverAnimation implements EventHandler {
        static final Duration ANIMATION_DURATION = new Duration(500);
        static final double ANIMATION_DISTANCE = 0.15;
        private double cos;
        private double sin;
        private PieChart chart;

        public MouseHoverAnimation(PieChart.Data d, PieChart chart) {
            this.chart = chart;
            double start = 0;
            double angle = calcAngle(d);
            for (PieChart.Data tmp : chart.getData()) {
                if (tmp == d) {
                    break;
                }
                start += calcAngle(tmp);
            }

            cos = Math.cos(Math.toRadians(start + angle / 2));
            sin = Math.sin(Math.toRadians(start + angle / 2));
        }

        @Override
        public void handle(MouseEvent arg0) {
            Node n = (Node) arg0.getSource();
            double minX = Double.MAX_VALUE;
            double maxX = Double.MAX_VALUE * -1;

            for (PieChart.Data d : chart.getData()) {
                minX = Math
                .min(minX, d.getNode().getBoundsInParent().getMinX());
                maxX = Math
                .max(maxX, d.getNode().getBoundsInParent().getMaxX());
            }

            double radius = maxX - minX;
            System.out.println("cos:" + cos);
            System.out.println("sin" + sin);
            TranslateTransitionBuilder.create()
                    .toX((radius * ANIMATION_DISTANCE) * cos)
                    .toY((radius * ANIMATION_DISTANCE) * (-sin))
                    .duration(ANIMATION_DURATION).node(n).build().play();
        }

        private static double calcAngle(PieChart.Data d) {
            double total = 0;
            for (PieChart.Data tmp : d.getChart().getData()) {
                total += tmp.getPieValue();
            }
            return 360 * (d.getPieValue() / total);
        }
    }

    static class MouseExitAnimation implements EventHandler {
        @Override
        public void handle(MouseEvent event) {
            TranslateTransitionBuilder.create().toX(0).toY(0)
            .duration(new Duration(500)).node((Node) event.getSource())
            .build().play();
        }
    }
}

 

<script type="text/javascript" id="gdt-72058698036477044|discuz_22913820_001">
var TencentGDT = TencentGDT || [];
TencentGDT.push(['72058698036477044|discuz_22913820_001',960,90,'graphic']);
(function() { 
   var doc=document, h=doc.getElementsByTagName('head')[0], s=doc.createElement('script'); s.async=true; s.src='http://qzs.qq.com/qzone/biz/res/q.js'; h && h.insertBefore(s,h.firstChild)})();
</script>

 

分享到:
评论

相关推荐

    JAVAFX实现的12生肖转盘

    JAVAFX实现的12生肖年份自动转换生肖转盘。。。。。。。。。。。

    在 JavaFx 中使用 JFreeChart 生成图表

    在JavaFX中,JFreeChart是一个非常有用的库,它允许开发者创建各种复杂的图表,如折线图、柱状图、饼图、散点图等。本文将深入探讨如何结合JavaFX与JFreeChart来实现图表的生成。 首先,我们需要了解JFreeChart库的...

    Getting Started with JavaFX 3D Graphics

    JavaFX是Java平台的一部分,用于构建丰富的客户端应用程序界面。JavaFX引入了3D图形支持,允许开发者创建和操作3D图形,从而扩展了Java的传统2D图形功能。本文将介绍JavaFX中3D图形的创建与操作的基础知识。 1. ...

    javafx-sdk-11.0.2

    JavaFX SDK 11.0.2 是一个用于开发富客户端应用程序的工具包,它在Java 11及更高版本中不再作为标准JDK的一部分。这个独立的SDK提供了必要的库和工具,使得开发者能够在Java平台上构建具有丰富图形用户界面(GUI)的...

    javaFX Demo 模板案例

    JavaFX 是一个用于构建桌面、移动和嵌入式设备上富客户端应用的开源图形用户界面(GUI)工具包。它是Java平台的一部分,提供了一系列高级特性,包括2D和3D图形处理、媒体支持、CSS样式以及强大的数据绑定机制。本...

    javafx 整合 sparingboot mybatis

    JavaFX 是一个用于开发桌面应用程序的Java库,它提供了丰富的用户界面组件和强大的图形功能。SpringBoot 是一个基于 Spring 框架的轻量级启动器,它简化了配置并帮助快速搭建应用。MyBatis 是一个优秀的持久层框架,...

    JavaFX API文档

    JavaFX API文档。Sun公司已于2008年12月05日发布了JavaFX技术的正式版,它使您能利用 JavaFX 编程语言开发互联网应用程序(RIA)。该产品于2007年5月在JavaOne大会上首次对外公布。JavaFX技术主要应用于创建Rich ...

    JavaFX 教程 (中文).docx

    【JavaFX 教程】 JavaFX 是一个用于创建桌面、移动和嵌入式系统的富客户端应用的Java平台。本教程将深入讲解如何使用JavaFX 8进行应用开发,特别是涉及Scene Builder工具,以及应用程序的打包和部署。Scene Builder...

    JavaFX 2.0 電子書 - Pro JavaFX 2

    最新JavaFx 2.0 電子書 In Pro JavaFX 2: A Definitive Guide to Rich Clients with Java Technology, Jim Weaver, Weiqi Gao, Stephen Chin, Dean Iverson, and Johan Vos show you how you can use the JavaFX ...

    javafx javafx javafx javafx

    javafx

    javafx使用指南-目录版.pdf

    JavaFX 使用指南 JavaFX 是一个基于 Java 语言的软件平台,用于开发桌面应用程序、移动应用程序和网络应用程序。它提供了一个统一的编程模型,可以跨平台运行,具有高清晰度的图形用户界面和多媒体支持。 JavaFX ...

    在IntelliJ IDEA 中使用 Gradle JavaFx

    【标题】: "在IntelliJ IDEA 中使用 Gradle JavaFx" 【正文】: JavaFX是一种用于构建桌面、Web和移动...对于更复杂的JavaFX应用,你可以进一步学习FXML来分离视图和控制逻辑,以及使用其他丰富的JavaFX组件和特效。

    javafx实现好看的界面

    JavaFX是一种强大的Java库,用于构建桌面、移动和嵌入式系统的富客户端应用程序。它提供了丰富的用户界面组件和高级图形功能,使得开发者可以创建出美观、互动性强的应用程序。在这个"javafxѧϰ"压缩包中,很可能...

    JavaFx登录跳转完整教程含源码

    JavaFx登录跳转完整教程含源码 本教程将指导读者如何使用JavaFx创建一个完整的登录跳转系统,包括登录页面的设计、验证账号密码、跳转到应用程序的首页等步骤。 知识点1:JavaFx简介 JavaFx是Oracle公司推出的一...

    javaFX高级教程JavaFX2.0的FXML语言 中文文档

    ### JavaFX 2.0 的 FXML 语言高级教程 #### 概述 JavaFX 2.0 引入了一种新的声明性标记语言——FXML(发音为 “fizz-le”),这是一种基于 XML 的语言,专门用于定义应用程序的用户界面。通过使用 FXML,开发者...

    javafx-src.zip_javaFx_退火_退火算法

    JavaFX 是一个用于创建桌面应用、移动应用和Web应用的开放源代码图形用户界面(GUI)工具包。它提供了一套丰富的UI控件、2D和3D图形处理能力,以及媒体播放支持,使得开发者可以构建出具有现代感且交互性强的应用...

    javafx2.2 API文档

    5. **图表组件**:JavaFX包含各种图表类型,如折线图、柱状图、饼图等,方便数据可视化。 6. **事件处理**:JavaFX提供了一套完整的事件处理机制,可以监听和响应用户的交互操作,如点击、拖动等。 7. **国际化**...

    饼图 柱图 代码

    除了JFreeChart,JavaFX也是一个强大的图形用户界面库,它内置了数据可视化组件,包括饼图和柱状图。在JavaFX中,你可以使用PieChart和BarChart类,直接将数据模型绑定到图表上,这使得动态更新数据变得更加方便。...

    javafx-11.0.2 jar.rar

    JavaFX是Java平台上的一个强大的富客户端应用开发框架,它为构建桌面、移动和Web应用程序提供了丰富的图形用户界面(GUI)工具集。标题中的"javafx-11.0.2 jar.rar"指的是JavaFX 11.0.2版本的库文件,这些文件被压缩...

Global site tag (gtag.js) - Google Analytics