JFreeChart 选择一个区域而不缩放

2023-11-22

我最近开始使用 JFreeChart,我想做一些事情,但我不确定是否可能。 我的程序应该从 wav 文件中绘制频谱图(声音图)。所以我设法从双数组列表中的 wav 文件中获取数据并将其显示在图表中。但现在我希望能够选择频谱图的一个区域(使用用于缩放的相同工具)而无需缩放,并且能够仅播放声音中选定的部分。但我根本找不到任何成功的方法。 这是我的图表代码:

    package classes;

import java.awt.Color;
import java.awt.Paint;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.RectangleInsets;

public class Chart{
    JFreeChart chart;
    Plot plot;

    //Constructeur de la classe Chart
    public Chart(double[][] bs, int channel, int framesLength, float frameRate)
    {
        // Création d'un XY chart
        XYSeries series = new XYSeries("XYGraph");
        int i=0,j=0;
        float k=0;
        //Ajout de tous les points du tableau de 16 bytes dans le chart
        for( i=0; i <channel;i++)
        {
            for(j=0; j< framesLength;j++)
            {
                //Division des valeurs par 2^15 pour être entre 1 et -1
                series.add(k, (bs[i][j]/32768));
                //Echelle de X
                k+=(1/frameRate);
            }
        }
        // Ajoute la série au dataset
        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        // Génération du graphe
        chart = ChartFactory.createXYLineChart(
        "Ajouter titre à la fonction de génération", // Titre
        "Temps (s)", // Nom de l'axe X
        "y-axis", // Nom de l'axe Y
        dataset, // Dataset
        PlotOrientation.VERTICAL, // Plot Orientation
        true, // Show Legend
        false, // Use tooltips
        false // Configure chart to generate URLs?
        );
        plot= (XYPlot) chart.getPlot();

    }
    //Renvoie le chart
    public JFreeChart getChart()
    {
        return chart;
    }

    public void color(Color c)
    {
        plot.setBackgroundPaint(c);
    }
}

在这里我调用 Chart 类并使用它:

Chart chartUn= new Chart(bs, channels  , frameLength , frameRate);
        chartUn.color(Color.pink);
        vue.setChartPanelUn(new ChartPanel(chartUn.getChart(), false));
        vue.getChartPanelUn().setRangeZoomable(false);
        vue.getChartPanelUn().setMouseWheelEnabled(true);

vue.getChartPanelUn() 返回一个 ChartPanel。 您知道如何解决我的问题吗? 多谢 (如果我的英语并不总是准确,很抱歉:/)


不要通过缩放来做到这一点,请使用MouseListener添加到您的ChartPanel添加一个Marker to the Domain axis.

在这个例子中我已经子类化MouseAdapter这样当您按下鼠标时,就会捕获域值(markerStart),当您释放鼠标时,位置会更新('markerEnd'),并且标记会添加到绘图中(updateMarker)

然后你会得到一个像这样的图表:

Chart with Domain Marker

请注意,在本例中我实际上关闭了缩放。

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.Layer;


public class MouseMarkerDemo extends JFrame {


    public MouseMarkerDemo(String title) {
        super(title);
        JPanel chartPanel = createDemoPanel();
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }


    private final static class  MouseMarker extends MouseAdapter{
        private Marker marker;
        private Double markerStart = Double.NaN;
        private Double markerEnd = Double.NaN;
        private final XYPlot plot;
        private final JFreeChart chart;
        private  final ChartPanel panel;


        public MouseMarker(ChartPanel panel) {
            this.panel = panel;
            this.chart = panel.getChart();
            this.plot = (XYPlot) chart.getPlot();
        }

        private void updateMarker(){
            if (marker != null){
                plot.removeDomainMarker(marker,Layer.BACKGROUND);
            }
            if (!( markerStart.isNaN() && markerEnd.isNaN())){
                if ( markerEnd > markerStart){
                    marker = new IntervalMarker(markerStart, markerEnd);
                    marker.setPaint(new Color(0xDD, 0xFF, 0xDD, 0x80));
                    marker.setAlpha(0.5f);
                    plot.addDomainMarker(marker,Layer.BACKGROUND);
                }
            }
        }

        private Double getPosition(MouseEvent e){
            Point2D p = panel.translateScreenToJava2D( e.getPoint());
            Rectangle2D plotArea = panel.getScreenDataArea();
            XYPlot plot = (XYPlot) chart.getPlot();
            return plot.getDomainAxis().java2DToValue(p.getX(), plotArea, plot.getDomainAxisEdge());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            markerEnd = getPosition(e);
            updateMarker();
        }

        @Override
        public void mousePressed(MouseEvent e) {
            markerStart = getPosition(e);
        }
    }

    private static XYDataset createDataset() {

        XYSeries series1 = new XYSeries("Data");
        series1.add(1.0, 1.0);
        series1.add(2.0, 4.0);
        series1.add(3.0, 3.0);
        series1.add(4.0, 5.0);
        series1.add(5.0, 5.0);
        series1.add(6.0, 7.0);
        series1.add(7.0, 7.0);
        series1.add(8.0, 8.0);

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        return dataset;

    }


    private static JFreeChart createChart(XYDataset dataset) {

        JFreeChart chart = ChartFactory.createXYLineChart(
            "Mouse Marker",
            "X",
            "Y",
            dataset,
            PlotOrientation.VERTICAL,
            true,
            true,
            false
        );
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        XYLineAndShapeRenderer renderer
                = (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        renderer.setBaseShapesFilled(true);
        return chart;
    }

    public static JPanel createDemoPanel() {
        final JFreeChart chart = createChart(createDataset());
        final ChartPanel panel = new ChartPanel(chart);
        panel.setRangeZoomable(false);
        panel.setDomainZoomable(false);
        panel.addMouseListener(new MouseMarker(panel));
        return panel;
    }

    public static void main(String[] args) {
        MouseMarkerDemo demo = new MouseMarkerDemo("JFreeChart: MouseMarkerDemo.java");
        demo.pack();
        demo.setVisible(true);
    }

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

JFreeChart 选择一个区域而不缩放 的相关文章

随机推荐

  • 当 rpm 文件中存在用于 rpm 安装的“缺少”lib 时

    我正在为 centos 生成一个 rpm 文件 但是当我尝试在干净的机器上安装它时 它失败了 gt Running transaction check gt Package grass x86 64 0 6 4 4 1 el6 will b
  • Facebook 登录无法在 Safari/ iPhone 中打开

    我正在创建一个显示 Facebook 好友的应用程序 首先 用户需要单击登录按钮 然后在填写登录 ID 和密码后会出现一个简单的弹出屏幕 其中将显示好友列表 一切正常 可以在 Firefox Chrome IE 上运行 但不会在 Safar
  • Apache POI - 使用 XSSFWorkbok + servlet 响应

    我的 java 应用程序在启用下载 XLSX 文件时遇到问题 按照此链接中显示的示例 使用 Apache POI 创建 excel 文件供用户下载 我尝试了两种配置来下载 保存电子表格 首先使用 XLS 文件 response setCon
  • Java/JavaScript 日期:这是真的吗?

    假设用户在与应用程序服务器不同的时区通过浏览器运行我的 Web 应用程序 我使用 JavaScript 在客户端序列化日期date getTime 方法 我通过 Json 发送结果毫秒 然后通过调用在服务器端创建一个 Java Date 对
  • UITextField - 仅允许数字和标点输入/键盘

    我已经尝试过下面的代码 但只允许输入键盘上的数字 我的应用程序要求键盘使用句号 句号 用于金钱交易 我尝试的代码是 BOOL textField UITextField textField shouldChangeCharactersInR
  • Spark 作业因 java.io.NotSerializedException: org.apache.spark.SparkContext 失败

    当我尝试应用方法 ComputeDwt 时 我遇到了上述异常RDD Int ArrayBuffer Int Double 输入 我什至正在使用extends Serialization在 Spark 中序列化对象的选项 这是代码片段 inp
  • 将 MvxCommand 与 CommandParameter 绑定结合使用

    我正在尝试用火MvxCommand 与 CommandParameter 但面临以下问题 MyView axml 包含
  • 如何在 XCode 中使用 ARM 汇编器?

    出于教育目的 我想向现有的 iPhone 应用程序添加一个用 ARM 汇编语言编写的函数 一般来说 我不需要 ARM 汇编教程 因为我已经读了太多了 我只是不知道如何实际运行代码 我想做的是这样的 无用 h void useless 无用
  • 无法将图像渲染到 HttpContext.Response.OutputStream

    基本上我试图在 ASP NET 处理程序中渲染一个简单的图像 public void ProcessRequest HttpContext context Bitmap image new Bitmap 16 16 Graphics gra
  • Android:根据给定的 id 获取列表视图中项目的位置:

    getItemIdAtPosition 是android中的一个函数 用于获取列表视图中给定项目的位置的id 有什么方法可以做相反的事情 即获取项目的位置是给定其 id 的列表视图吗 不可以 你必须手动完成 在您正在使用的适配器中创建一个公
  • 使用 linq 按范围分组[重复]

    这个问题在这里已经有答案了 我们如何使用等于或大于的分组范围 var data new new Id 0 Price 2 new Id 1 Price 10 new Id 2 Price 30 new Id 3 Price 50 new I
  • 错误:“您在短时间内创建或删除了太多日历或日历事件。”

    第一次在这里提问 我构建了一个 Google 应用程序脚本 它从 Google 表格获取事件信息 并基于以下内容在 Google 日历上创建事件 Mogsdad 的回答在这里 由于我不存在的声誉 我无法在该线程上发布问题 exportEve
  • 使用vue js和axios上传多个文件

    我正在尝试使用 vuejs 和 axios 上传多个图像 但在服务器端我得到空对象 我在标头中添加了 multipart form data 但仍然是空对象 submitFiles Initialize the form data let
  • 将整数转换为日期

    我在将整数日期 20180525 转换为 YYYY MM DD 格式的日期时遇到问题 有没有办法做到这一点 或者我应该将其转换为代码 在本例中为Java 任何对此的帮助将不胜感激 谢谢你 如果您的日期以 YYYYMMDD 形式存储为整数 则
  • MySQL数据库中指定的两个主键

    我正在尝试创建一个测试数据库 它是预先存在的数据库的副本 我正在使用 Django 模型 理论上是与原始数据库一起使用的模型 来执行此操作 我最近从其他人那里继承了代码 并试图弄清楚代码到底发生了什么 在该模型中 其中一个表有两列标识为主键
  • C中按空格分割字符串

    我正在使用 C 语言 通过套接字我将收到一条消息 其中包含一个空格 我需要将字符串拆分为空格处的部分 我该怎么做呢 strtok r是你的朋友 不要使用普通的strtok 因为它不是线程安全的 即使在线程安全的平台上 因为状态保存在线程本地
  • 如何使用cmake在源代码中生成标头?

    在我的项目中 我有一个 架构 文件和实用程序 用于生成头文件 我正在使用 cmake 和源代码构建来构建应用程序 目前我必须手动重新生成头文件 然后构建应用程序 然后我想出了这个 CMakeLists txt 语句 但它们在构建目录而不是源
  • python套接字文件传输

    我正在尝试通过套接字写入传输文件或数据块 我感觉好像我在重新发明轮子 但我对简单解决方案的搜索失败了 我发现的所有内容要么太简单 要么太复杂 服务器将在运行 python 2 5 4 的手机上运行 预期的应用程序是在手机和主机之间同步音乐文
  • 如何防止 VS 2008 在发布过程中发布 .svn 文件夹?

    在 Visual Studio 2008 中发布 ASP NET 网站时 有没有一种方法可以强制它忽略本地工作副本中的 svn 文件夹 以便我的目标文件夹最终不会出现 svn 文件作为输出 Thanks Jason Visual Studi
  • JFreeChart 选择一个区域而不缩放

    我最近开始使用 JFreeChart 我想做一些事情 但我不确定是否可能 我的程序应该从 wav 文件中绘制频谱图 声音图 所以我设法从双数组列表中的 wav 文件中获取数据并将其显示在图表中 但现在我希望能够选择频谱图的一个区域 使用用于