【问题标题】:JFreeChart simple plot (parabola)JFreeChart 简单图(抛物线)
【发布时间】:2013-11-19 20:54:37
【问题描述】:

我使用 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 个坐标)。怎么做?如何用新系数重建绘图?

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    给定一个名为cmdChartMouseEvent,忽略XYItemEntity 以外的任何类型其他 的实体。一旦你知道了实体,就不要插值——只需查询数据集。

    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)

    【讨论】:

    • 谢谢,它有效!释放鼠标按钮后有什么方法可以获取点坐标?按下鼠标按钮时,chartMouseMoved 不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2011-07-02
    • 2014-11-26
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多