使用 JSlider 实时更新 jFreeChart 的透明度

2023-12-27

我想问这个问答问题的后续问题(JFreeChart 可见后如何更新其外观? https://stackoverflow.com/questions/5522575/how-can-i-update-a-jfreecharts-appearance-after-its-been-made-visible)来自@trashgod。

我试图给用户一个JSlider控制图表的透明度。我添加了一个JSlider and a ChangeListener每当 JSlider 发生变化时就重新绘制。

slider.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        chartPanel.repaint();
    }
});

但是,直到用户用鼠标“单击”图形时,透明度才会更新。为什么这不起作用?

这是 SSCCE(带有 jFreeChart 库):

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.AttributedString;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.JFrame;

import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.basic.BasicButtonListener;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.PieToolTipGenerator;
import org.jfree.chart.plot.MultiplePiePlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.util.TableOrder;

/**
 * This example is similar to {@link MultiplePieChartDemo1}, but slices the
 * dataset by column rather than by row.
 */
public class MultiplePieChart extends JPanel {

    /**
     * Creates a sample dataset.
     *
     * @return A sample dataset.
     */
    private static CategoryDataset createDataset() {
        BigInteger topSources_quan = new BigInteger("100");
        BigInteger notTopSources_quan = new BigInteger("10");
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(topSources_quan, "Included Sources", "Sales Quantity");
        dataset.addValue(notTopSources_quan, "Not Included Sources", "Sales Quantity");

        BigDecimal topSources_total = new BigDecimal("1450.34");
        BigDecimal notTopSources_total = new BigDecimal("99.78");
        dataset.addValue(topSources_total, "Included Sources", "Sales Total");
        dataset.addValue(notTopSources_total, "Not Included Sources", "Sales Total");

        return dataset;
    }

    /**
     * Creates a sample chart with the given dataset.
     *
     * @param dataset  the dataset.
     *
     * @return A sample chart.
     */
    private static JFreeChart createChart(CategoryDataset dataset, Dimension size, String chartTitle, boolean includeLegend, final JSlider slider) {
        JFreeChart chart = ChartFactory.createMultiplePieChart(
            chartTitle,  // chart title
            dataset,               // dataset
            TableOrder.BY_COLUMN,
            includeLegend,                  // include legend
            true,
            false
        );
        chart.setBackgroundPaint(new GradientPaint(0, 0, new Color(240,240,240), 0, ((int)size.getHeight() / 2), new Color(200, 200, 200), true));
        TextTitle title = new TextTitle(chartTitle == null? "" : chartTitle, new Font("Tahoma", Font.BOLD, 16));
        chart.setTitle(title);

        if(includeLegend) {
            LegendTitle legend = chart.getLegend();
            legend.setBackgroundPaint(new Color(0, 0, 0, 0));
            legend.setItemFont(new Font("Tahoma", Font.PLAIN, 12));
            legend.setBorder(0, 0, 0, 0);
        }

        MultiplePiePlot plot = (MultiplePiePlot) chart.getPlot();
        JFreeChart stamper = plot.getPieChart();

        if(dataset.getColumnCount() == 1) {
            stamper.getTitle().setFont(new Font("Tahoma", Font.PLAIN, 0));
        } else {
            stamper.getTitle().setFont(new Font("Tahoma", Font.PLAIN, 12));
        }
        stamper.setBackgroundPaint(new GradientPaint(0, 0, new Color(240,240,240), 0, ((int)size.getHeight() / 2), new Color(200, 200, 200), true));

        plot.setOutlineStroke(null);
        plot.setBackgroundAlpha(.25f);

        JFreeChart subchart = plot.getPieChart();
        final PiePlot p = (PiePlot) subchart.getPlot();

        p.setBackgroundAlpha(0f);
        p.setOutlineStroke(null);
        p.setSectionPaint("Included Sources", new Color(0,100,255));
        p.setSectionPaint("Not Included Sources", new Color(255, 50, 50));
        p.setStartAngle(0);
        p.setLabelFont(new Font("Tahoma", Font.PLAIN, 9));
        p.setForegroundAlpha(.6f);

        if(slider != null) {
            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    float value = (float)slider.getValue() / (float)100;
                    System.out.println("Setting foreground alpha:" + value);
                    p.setForegroundAlpha(value);

                }
            });
        }
        p.setMaximumLabelWidth(0.20);

        p.setLabelGenerator(null);
        PieToolTipGenerator cttg = new PieToolTipGenerator() {

            @Override
            public String generateToolTip(PieDataset dataset, Comparable key) {
                Number val = dataset.getValue(key);
                if(val instanceof BigDecimal) {
                    DecimalFormat df = new DecimalFormat("$ #,##0.00");
                    return df.format(val.floatValue());
                } else if(val instanceof BigInteger) {
                    DecimalFormat df = new DecimalFormat("#,##0");
                    return df.format(val.intValue());
                } else
                    return val.toString();
            }


        };
        p.setToolTipGenerator(cttg);

        return chart;
    }

    /**
     * Creates a panel for the demo (used by SuperDemo.java).
     *
     * @return A panel.
     */
    public static JPanel createPanel(final JFrame parentFrame, CategoryDataset dataset, Dimension size, String chartTitle, boolean includeLegend, JSlider slider) {
        JFreeChart chart = createChart(dataset, size, chartTitle, includeLegend, slider);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setMouseWheelEnabled(true);
        if(size != null)
            chartPanel.setPreferredSize(size);

        if(slider != null) {
            slider.addChangeListener(new ChangeListener() {
                @Override
                public void stateChanged(ChangeEvent e) {
                    chartPanel.repaint();
                }
            });
        }
        return chartPanel;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JSlider slider = new JSlider();
        JFrame sliderFrame = new JFrame();
        sliderFrame.add(slider);
        sliderFrame.pack();
        JPanel panel = createPanel(frame, createDataset(), new Dimension(800, 500), "Sales", true, slider);
        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        sliderFrame.setLocation(frame.getLocationOnScreen().x + frame.getWidth() - slider.getWidth(), frame.getLocationOnScreen().y + frame.getHeight());
        sliderFrame.setVisible(true);
        sliderFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }

    static class CustomLabelGenerator implements PieSectionLabelGenerator {
        public String generateSectionLabel(PieDataset dataset, Comparable key) {

            if(dataset.getValue(key) instanceof BigInteger) {
                NumberFormat nf = new DecimalFormat("#,##0");
                return nf.format(((BigInteger)dataset.getValue(key)).intValue());
            } else if (dataset.getValue(key) instanceof BigDecimal) {
                NumberFormat nf = new DecimalFormat("$ #,##0.00");
                return nf.format(((BigDecimal)dataset.getValue(key)).doubleValue());
            } else {
                return dataset.getValue(key).toString();
            }
        }

        public AttributedString generateAttributedSectionLabel(
                PieDataset dataset, Comparable key) {
            return null;
        }

    }
}

关键问题是通知图表您已经修改了“饼形图 http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/plot/MultiplePiePlot.html#getPieChart%28%29用于绘制各个饼图。”

chart.fireChartChanged(); 

简化的 SSCCE:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.math.BigDecimal;
import java.math.BigInteger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.MultiplePiePlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.util.TableOrder;

/**
 * @see http://stackoverflow.com/a/17370398/230513
 * This example is similar to {@link MultiplePieChartDemo1}, but slices the
 * dataset by column rather than by row.
 */
public class MultiplePieChart extends JPanel {

    private JSlider slider = new JSlider();

    private CategoryDataset createDataset() {
        BigInteger topSources = new BigInteger("100");
        BigInteger notTopSources = new BigInteger("10");
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(topSources, "Included Sources", "Sales Quantity");
        dataset.addValue(notTopSources, "Not Included Sources", "Sales Quantity");

        BigDecimal topSourcesTotal = new BigDecimal("1450.34");
        BigDecimal notTopSourcesTotal = new BigDecimal("99.78");
        dataset.addValue(topSourcesTotal, "Included Sources", "Sales Total");
        dataset.addValue(notTopSourcesTotal, "Not Included Sources", "Sales Total");

        return dataset;
    }

    private JFreeChart createChart() {
        final JFreeChart chart = ChartFactory.createMultiplePieChart(
            "Sales", createDataset(), TableOrder.BY_COLUMN, true, true, false);
        MultiplePiePlot plot = (MultiplePiePlot) chart.getPlot();
        JFreeChart subchart = plot.getPieChart();
        final PiePlot p = (PiePlot) subchart.getPlot();
        p.setForegroundAlpha(0.5f);
        slider.setValue((int) (p.getForegroundAlpha() * 100));
        slider.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                float value = (float) slider.getValue() / (float) 100;
                p.setForegroundAlpha(value);
                chart.fireChartChanged();
            }
        });
        return chart;
    }

    public JPanel createChartPanel() {
        JFreeChart chart = createChart();
        final ChartPanel chartPanel = new ChartPanel(chart) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 400);
            }
        };
        return chartPanel;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MultiplePieChart mpc = new MultiplePieChart();
                JFrame frame = new JFrame();
                frame.add(mpc.createChartPanel());
                frame.add(mpc.slider, BorderLayout.SOUTH);
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JSlider 实时更新 jFreeChart 的透明度 的相关文章

  • 如何获取枚举的子集

    大多数情况下 包含所有元素的枚举显示在用户界面的下拉列表中 我们只需要在用户界面中显示 5 个字段中的 2 个 通过某种方式利用可用于枚举的相同函数来获取此数据的更简单方法是什么 enum Color RED GREEN BLACK BLU
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 哪个类调用了我的静态方法?

    假设我有一个带有静态方法的 Java 类 如下所示 class A static void foo Which class invoked me 进一步假设 A 类有任意数量的子类 class B extends A class C ext
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • Eclipse 自动完成更改变量名称

    只是一个愚蠢的问题 但很难搜索 因为有很多关于 Eclipse 自动完成的主题 而且很难找到与我的问题匹配的内容 所以问题是 如果我写 MyClass MyVarName 然后按空格键 添加 new MyClass Eclipse 自动添加
  • 将 JSON Map 传递到 Spring MVC 控制器

    我正在尝试将 Map 的 JSON 表示形式作为 POST 参数发送到我的控制器中 RequestMapping value search do method RequestMethod GET consumes application j
  • JPA:如何将字符串持久保存到数据库字段中,输入 MYSQL Text

    需求是用户可以写文章 所以我选择typeText为了contentmysql数据库内的字段 我怎样才能转换Java String into MySQL Text 干得好Jim Tough Entity public class Articl
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • 确定代码是否在 App Engine 运行时 (Java) 上运行

    如何确定某些代码 Serv let 或简单的类 是否正在 Google App Engine 运行时 Java 上运行 以便决定是否使用 App Engine 的特定库 是否有一些可靠的运行时环境 ID 您可以检查com google ap
  • JSON 对象数组转 Java POJO

    将此 JSON 对象转换为 java 中的类 您的 POJO 类中的映射将如何 ownerName Robert pets name Kitty name Rex name Jake This kind of question is ver
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 如何告诉 cxf 将包装类型保留在方法中?

    在我的 WSDL 中我有一个操作
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 多对多不检索映射数据

    Spring boot 2 5 6 我无法安装版本 概要文件 java Getter Setter NoArgsConstructor AllArgsConstructor EqualsAndHashCode FieldDefaults l
  • Java .split("|") 不工作

    我刚刚遇到了一个问题分割法 http docs oracle com javase 6 docs api java lang String html split 28java lang String 29for 字符串不适用于字符 作为一个
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • 如何配置嵌入式 MongoDB 以在 Spring Boot 应用程序中进行集成测试?

    我有一个相当简单的 Spring Boot 应用程序 它公开一个小型 REST API 并从 MongoDB 实例检索数据 对 MongoDB 实例的查询通过基于 Spring Data 的存储库 下面的一些关键代码 Main applic
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 如何隐藏或删除 Android HoneyComb 中的状态栏?

    如何隐藏或删除 Android HoneyComb 中的状态栏 每次运行应用程序时 我都会发现某些内容必须被状态栏覆盖 我尝试改变AndroidManifest xml 但没有任何改变 你不知道 它被认为是永久的屏幕装饰 就像电容式主页 菜

随机推荐

  • 如何使用 Django FileFields 在模板中显示当前文件

    我有点卡住了 我已经使用 Django 一段时间了 但我实际上似乎无法找到这个东西 这很奇怪 因为它应该是一件简单的事情 我一直在谷歌上搜索 似乎找不到解决方案 这可能是因为它很简单 问题是 我有一个 ModelForm 它有一个 File
  • Excel 工作簿的 R Download.File 问题

    我正在尝试使用 R 下载 Excel 工作簿下载文件 http stat ethz ch R manual R patched library utils html download file html功能 当我手动下载文件 使用 Inte
  • POI中如何判断文件是doc还是docx

    标题可能有点令人困惑 最简单的方法必须是通过扩展名来判断 如下所示 is represents the InputStream if filePath endsWith doc WordExtractor ex new WordExtrac
  • 显示:内联表

    IE 7 不支持display inline table 其他浏览器支持 对于替代解决方案我应该做什么 火狐和 IE8 支持display inline table IE6支持display inline table class inlin
  • 从 data.frame 到 ggplot2 图例的表达式

    我想向图例条目添加一个表达式 而不直接输入图例 因为我正在循环变量 本质上我想要这样 d lt data frame x 1 10 y 1 10 f rep c 0 74 gt 75 each 5 qplot x y data d colo
  • LoopBack:如何在代码中动态创建自定义 REST 端点(即时)

    我们使用 LoopBack REST 框架来公开我们的数据库 和业务逻辑 我们需要允许客户在数据库 单租户和多租户 中创建自定义表 这些表可以通过 REST 端点进行访问 所有客户都需要使用相同的通用 生产 REST 端点 这些端点将公开在
  • Flutter 是否支持 FieldPath?

    我找不到FieldPath in the cloud firestore颤振插件 https pub dartlang org packages cloud firestore但是 我认为这是一个非常常见的工具 将是此类插件的第一个实现之一
  • NativeScript WebView在默认浏览器中打开url

    我正在尝试构建应用程序WebView以及 WebView 内 URL 上的单击 点击事件 下面的解决方案打开外部浏览器和 URL 但它也在 webview 中加载相同的 url 内容 有没有办法阻止在 webview 中加载新的 url 这
  • 运行“npm install”时保留符号链接

    如果我们这样做 npm link x 然后我们跑npm install 它将覆盖符号链接包 有没有办法跑npm install不覆盖符号链接包 就像是 npm install preserve symlinks or npm install
  • 如何防止单击锚元素内的图像时的链接行为?

    我有一个与此类似的代码 a href link html goto link page img src images edit gif alt a 现在 如果您单击文本 我希望 href 链接能够正常工作 但是如果您单击图像 它应该执行其他
  • 在 Safari 中跳转输入字段

    我正在尝试重新创建一个非常酷的占位符用户界面 http dribbble com shots 1254439 GIF Mobile Form Interaction list users只使用 HTML 和 CSS 我就差不多明白了 dem
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • C# - 值类型的引用包装器

    我想用c Pointtype 作为引用类型 它是一个结构 我想到了上课CPoint 其中将包含一个Point成员 有什么办法可以提高会员人数吗 Point担任成员Cpoint 我正在努力避免 cpoint point X cpoint po
  • SQL Server 从表中读取 csv 二进制文件

    我目前将 csv 格式的文件存储在磁盘上 然后像这样查询它们 SELECT FROM OPENROWSET BULK C myfile csv FORMATFILE C format fmt FIRSTROW 2 AS rs 其中 form
  • javascript 中计数器变量的奇怪值[重复]

    这个问题在这里已经有答案了 可能的重复 Javascript 臭名昭著的循环问题 https stackoverflow com questions 1451009 javascript infamous loop problem 由于某种
  • Django 1.9:django.core.exceptions.AppRegistryNotReady:应用程序尚未加载

    我正在尝试使用这个应用程序https github com benliles django chance https github com benliles django chance在我的应用程序中 我的 Django 版本是 1 9 我
  • 底部对齐 R 闪亮按钮

    我无法找到底部对齐的方法downloadButton with a selectizeInput i e library shiny runApp list ui shinyUI fluidPage fluidRow align botto
  • 如何在Android上像instagram一样实现视频过滤器[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要在我的 Android 应用程序中添加视频过滤器 例如Instagram 我搜索了很多 但没有找
  • 打印 HasMorePages 不起作用 c#

    好吧 所以我一直在四处寻找 在 SO 和 Google 上 看看一个问题是否可以解决我的错误 但显然不能 所以这里是 我正在尝试打印有时会超过一页的内容 并且我正在检查要打印的页数 检查完所有这些逻辑后 我使用HasMorePages属性来
  • 使用 JSlider 实时更新 jFreeChart 的透明度

    我想问这个问答问题的后续问题 JFreeChart 可见后如何更新其外观 https stackoverflow com questions 5522575 how can i update a jfreecharts appearance