JFreeChart选择一个没有缩放的区域

时间:2013-04-19 13:03:11

标签: java zoom jfreechart area chartpanel

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

    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。 你有一个idée如何解决我的问题? 非常感谢 (对不起,如果我的英语并不总是准确的话:/)

1 个答案:

答案 0 :(得分:13)

请勿通过缩放来执行此操作,使用添加到MouseListener的{​​{1}}将ChartPanel添加到Marker轴。

在这个示例中,我已经将Domain子类化,因此当您按下鼠标时,会捕获域值(MouseAdapter),当您释放鼠标时,会更新帖子('markerEnd')并且标记添加到图(markerStart

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

Chart with Domain Marker

请注意,在此示例中,我实际上已关闭缩放。

updateMarker