【问题标题】:How to change/customize Crosshair Overlays for JFreeChart?如何更改/自定义 JFreeChart 的十字线覆盖?
【发布时间】:2017-05-22 16:47:03
【问题描述】:

我正在尝试为 XYPlot 使用十字线覆盖。这工作得很好,虽然我想改变标签的绘制方式。这是我现在的 sn-p:

// add crosshair
final CrosshairOverlay crosshairOverlay = new CrosshairOverlay();
final Crosshair xCrosshair = new Crosshair(Double.NaN, Color.DARK_GRAY, new BasicStroke(0f));
xCrosshair.setLabelBackgroundPaint(new Color(1f, 1f, 1f, 0f));
xCrosshair.setLabelOutlineVisible(false);
xCrosshair.setLabelVisible(true);
xCrosshair.setLabelGenerator(new CrosshairLabelGenerator() {
    @Override
    public String generateLabel(final Crosshair ch) {
        return UnitConverter.freq2Str(ch.getValue());
    }
});

final Crosshair yCrosshair = new Crosshair(Double.NaN, Color.DARK_GRAY, new BasicStroke(0f));
yCrosshair.setLabelBackgroundPaint(new Color(1f, 1f, 1f, 0f));
yCrosshair.setLabelVisible(true);
yCrosshair.setLabelOutlineVisible(false);
yCrosshair.setLabelGenerator(new CrosshairLabelGenerator() {
    @Override
    public String generateLabel(final Crosshair ch) {
        return UnitConverter.val2Str(ch.getValue(), 5, "dBc/Hz");
    }
});

crosshairOverlay.addDomainCrosshair(xCrosshair);
crosshairOverlay.addRangeCrosshair(yCrosshair);
this.addOverlay(crosshairOverlay);
this.addChartMouseListener(new ChartMouseListener() {
    @Override
    public void chartMouseMoved(final ChartMouseEvent event) {
        final Rectangle2D dataArea = APChartPanel.this.getScreenDataArea();
        final XYPlot plot = (XYPlot) event.getChart().getPlot();
        final double x = plot.getDomainAxis().java2DToValue(event.getTrigger().getX(), dataArea, RectangleEdge.BOTTOM);
        final double y = plot.getRangeAxis().java2DToValue(event.getTrigger().getY(), dataArea, RectangleEdge.LEFT);
        xCrosshair.setValue(x);
        yCrosshair.setValue(y);
    }

    @Override
    public void chartMouseClicked(final ChartMouseEvent arg0) {}
});

这会产生以下标签:

首先,我想删除文本周围的框,并想控制字体大小和系列。但是使用Crosshair#setLabelOutlineVisible(boolean) 也会删除文本,而Crosshair#setLabelFont(Font) 根本不会改变字体。这仍在进行中还是我在这里做错了什么?


我得到了以下解决方案:

根据@trashgod 的建议扩展CrosshairOverlay,并将此代码用于单个十字准线:

final Crosshair yCrosshair = new Crosshair(Double.NaN, Color.GRAY, new BasicStroke(0f));
yCrosshair.setLabelBackgroundPaint(new Color(1f, 1f, 1f, 0.7f));
yCrosshair.setLabelPaint(Color.GRAY);
yCrosshair.setLabelVisible(true);
yCrosshair.setLabelOutlineVisible(false);
yCrosshair.setLabelFont(yCrosshair.getLabelFont().deriveFont(11f));
yCrosshair.setLabelGenerator(new CrosshairLabelGenerator() {
    @Override
    public String generateLabel(final Crosshair ch) {
        return UnitConverter.val2Str(ch.getValue(), 5, "dBc/Hz");
    }
});

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    CrosshairOverlay 方法drawVerticalCrosshair() 呈现十字准线标签,如here 所示,但它之前既未使用Crosshair::isLabelOutlineVisible 也未使用Crosshair::getLabelFont。你可以试试这样的:

    if (crosshair.isLabelOutlineVisible()) { g2.draw(hotspot); }
    g2.setFont(crosshair.getLabelFont());
    TextUtilities.drawAlignedString(label, g2, xx, yy, alignPt);
    

    从这个example开始,我做了以下更改以获得显示的结果。

    xCrosshair.setLabelFont(xCrosshair.getLabelFont().deriveFont(20f));
    xCrosshair.setLabelBackgroundPaint(new Color(1f, 1f, 1f, 0f));
    xCrosshair.setLabelOutlineVisible(false);
    

    drawHorizontalCrosshair() 中的类似代码也应该更新;也可能需要保存和恢复图形上下文的字体。

    【讨论】:

    • 感谢您的快速回复。我希望我做错了什么,但似乎这还没有完全完成(可能永远不会)。但是扩展CrosshairOverlay 实际上没有预期的那么麻烦。我已经添加了结果的屏幕截图。
    • @brimborium:很高兴它有帮助;已提交补丁here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2022-10-14
    相关资源
    最近更新 更多