本文介绍了JFreeChart简单图(抛物线)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用JFreeChart写了一个简单的抛物线图。

I wrote a simple parabola plot using JFreeChart.

package parabolademo;

import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.function.Function2D;
import org.jfree.data.function.PolynomialFunction2D;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;


public class ParabolaDemo extends ApplicationFrame {

/*
 * @param title  the frame title.
 */
public ParabolaDemo(final String title) {

    super(title);
    double[] a = {0.0, 0.0, 3.0};
    Function2D p = new PolynomialFunction2D(a);
    XYDataset dataset = DatasetUtilities.sampleFunction2D(p, -20.0, 20.0, 100, "Function");
    final JFreeChart chart = ChartFactory.createXYLineChart(
        "Parabola",
        "X",
        "Y",
        dataset,
        PlotOrientation.VERTICAL,
        true,
        true,
        false
    );

    final ChartPanel chartPanel = new ChartPanel(chart);
    chartPanel.addChartMouseListener(new ChartMouseListener() {

        @Override
        public void chartMouseClicked(ChartMouseEvent cme) {
            Point2D po = chartPanel.translateScreenToJava2D(cme.getTrigger().getPoint());
            Rectangle2D plotArea = chartPanel.getScreenDataArea();
            XYPlot plot = (XYPlot) chart.getPlot(); // your plot
            double chartX = plot.getDomainAxis().java2DToValue(po.getX(), plotArea, plot.getDomainAxisEdge());
            double chartY = plot.getRangeAxis().java2DToValue(po.getY(), plotArea, plot.getRangeAxisEdge());
            System.out.println("Clicked!");
            System.out.println("X:" + chartX + ", Y:" + chartY);
        }

        @Override
        public void chartMouseMoved(ChartMouseEvent cme) {

        }
    });
    chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
    setContentPane(chartPanel);
}

public static void main(final String[] args) {

    final ParabolaDemo demo = new ParabolaDemo("Parabola Plot Demo");
    demo.pack();
    RefineryUtilities.centerFrameOnScreen(demo);
    demo.setVisible(true);
}

}

如何获取FUNCTION PLOT点的坐标(我的chartMouseListener获取窗口中任意点的坐标)?用户移动鼠标并释放鼠标按钮后如何接收点坐标?
我希望在单击鼠标时,绘图的点跟随鼠标,因此将重建绘图(为此目的,需要再次计算系数,知道此坐标并采用任何其他2个坐标) 。怎么做?如何使用新系数重建情节?

How to get coordinates of FUNCTION PLOT point (my chartMouseListener get coordinates of any point in window)? how to receive point coordinates after the user moved mouse and released the mouse button?I want that when clicking a mouse, the point of the plot followed a mouse, thus the plot will be rebuilt (for this purpose it is necessary to calculate again coefficients, knowing this coordinate and having taken any 2 other coordinates). How it can be done? How rebuilt plot with new coefficients?

推荐答案

给定 ChartMouseEvent 命名 cmd ,忽略任何类型的实体其他而不是 XYItemEntity 。一旦你知道了实体,就不要插值 - 只查询数据集。

Given a ChartMouseEvent named cmd, ignore entities of any type other than XYItemEntity. Once you know the entity, don't interpolate—just query the dataset.

ChartEntity ce = cme.getEntity();
if (ce instanceof XYItemEntity) {
    XYItemEntity e = (XYItemEntity) ce;
    XYDataset d = e.getDataset();
    int s = e.getSeriesIndex();
    int i = e.getItem();
    System.out.println("X:" + d.getX(s, i) + ", Y:" + d.getY(s, i));
}

还可以考虑调用 setBaseShapesVisible(true)在剧情的渲染器上。

Also consider invoking setBaseShapesVisible(true) on the plot's renderer.

这篇关于JFreeChart简单图(抛物线)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-04 22:30