JFreeChart系列工具提示在形状注释上方

4

我有一个XYPlot,上面有系列和一些没有填充的动态添加的形状注释(因此每个系列点都可见)。是否可以在注释上显示系列工具提示(显示鼠标指针当前指向的系列点的坐标)?或者如何重新排列元素以使工具提示可见。


你是指这里看到的_label_吗?(http://sites.google.com/site/drjohnbmatthews/jfreechartdemo) - trashgod
我有一个图表,在其中添加了一个圆形作为形状注释。但是,将其添加到系列点上会覆盖它们(尽管没有填充),从而使工具提示无法正常工作。如果可能的话,我希望能够保留注释并仍然使用工具提示。 - jpo
1个回答

9
我怀疑您是将形状注释添加到图表中,这些注释是最后绘制的。相反,在Layer.BACKGROUND中将它们添加到渲染器中。如下所示,圆圈不会遮挡(20,20)处的工具提示。还要注意,(10,10)没有受到线注释的影响,而(30,30)被弧形遮挡了。

image

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.util.Random;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYLineAnnotation;
import org.jfree.chart.annotations.XYShapeAnnotation;
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;

/**
 * @see https://dev59.com/5FnUa4cB1Zd3GeqPbIWb
 * @see http://stackoverflow.com/questions/6604211
 */
public class ArcTest {

    private static final Random r = new Random();
    private static final Color blue = Color.blue;
    private static final BasicStroke stroke = new BasicStroke(2.0f);
    private static final double PI = 180d;
    private static final int X = 8;
    private static final int Y = 0;
    private static final int W = 6 * X;
    private static final int H = 3 * X;

    public static void main(String[] args) {
        JFreeChart chart = ChartFactory.createXYLineChart(
            "ArcTest", "X", "Y", createDataset(),
            PlotOrientation.VERTICAL, true, true, false);
        XYPlot plot = chart.getXYPlot();

        XYLineAndShapeRenderer renderer =
            (XYLineAndShapeRenderer) plot.getRenderer();
        renderer.setBaseShapesVisible(true);
        Ellipse2D.Double circle = new Ellipse2D.Double(X, X, 20, 20);
        renderer.addAnnotation(new XYShapeAnnotation(
            circle, stroke, blue), Layer.BACKGROUND);

        XYLineAnnotation line = new XYLineAnnotation(X, Y, X, H, stroke, blue);
        plot.addAnnotation(line);
        Arc2D.Double arc = new Arc2D.Double(X, Y, W, 2 * H, PI, PI, Arc2D.OPEN);
        plot.addAnnotation(new XYShapeAnnotation(arc, stroke, blue));

        ChartFrame frame = new ChartFrame("Test", chart);
        frame.pack();
        frame.setVisible(true);
    }

    private static XYDataset createDataset() {
        XYSeriesCollection result = new XYSeriesCollection();
        XYSeries series = new XYSeries("ArcTest");
        series.add(0, 0);
        series.add(10, 10);
        series.add(20, 20);
        series.add(30, 30);
        series.add(W, W);
        result.addSeries(series);
        return result;
    }
}

感谢你总是附带一些示例代码来回答问题。 - jpo
请参考此示例 - trashgod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接