java - 如何更改/自定义 JFreeChart 的十字准线覆盖?

标签 java jfreechart

我正在尝试为 XYPlot 使用十字准线覆盖。这工作得很好,但我想改变标签的绘制方式。这是我当前的片段:

// 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) {}
});

这会产生以下标签:

current labels

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


我找到了以下解决方案:

final result

根据@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");
    }
});

最佳答案

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);

image

drawHorizo​​ntalCrosshair() 中的类似代码也应该更新;保存和恢复图形上下文的字体也可能是有保证的。

关于java - 如何更改/自定义 JFreeChart 的十字准线覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44118184/

相关文章:

java - 将饼图设置为 JLabel 而不是新框架

java - 如何在时间序列图表上显示数据库中存储的时间

java - 在编写 Java 代码时,我们真的需要 @Override 等吗?

java - 优雅地关闭 spring 批处理并在失败的情况下恢复批处理

java - Android状态栏设置背景颜色为半透明颜色

image - JFreechart 图像不是使用 OpenJDK 创建的

jasper-reports - JFreeChartRenderer 类型已被弃用,我应该使用什么方法?

java - 系统剪贴板操作的右键菜单项

java - 成功登录后,Spring 总是重新编辑到默认目标 URL

java - 如何向 BoxAndWhiskerChart 添加线条?