2017-05-22 12 views
2

XYPlotに十字オーバーレイを使用しようとしています。これはかなりうまくいきますが、ラベルを描く方法を変更したいと思います。私はテキストの周囲にボックスを削除したいとフォントを制御したいと思い、スタートとしてJFreeChartのクロスヘアオーバーレイを変更/カスタマイズするには?

current labels

:これは、次のラベルになり

// 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 result

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

答えて

1

CrosshairOverlay方法drawVerticalCrosshair()は、図のように十字ラベルをレンダリングします。hereどちらもCrosshair::isLabelOutlineVisibleでもCrosshair::getLabelFontもありません。あなたはこのような何か試してみてください:このexampleから始まっ

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

を、私が示した結果を得るために、以下の変更を加えました。

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

image

drawHorizontalCrosshair()で類似のコードも更新されなければなりません。グラフィックスコンテキストのフォントを保存して復元することもまた保証される。

+1

速い返信をありがとう。私は何か間違っていることを望んだが、これはまだ完全に終了していないようだ(恐らく決してないだろう)。しかし、「CrosshairOverlay」を拡張することは、実際には予想よりも邪魔になりませんでした。結果のスクリーンショットを追加しました。 – brimborium

+1

@ブリムボリウム:喜んで助けました。パッチが提出されている[ここ](http://www.jfree.org/forum/viewtopic.php?f=3&t=117824)。 – trashgod

関連する問題