uzyskanie etykiet dla punktów na wykresie świecowym - JFreeChart, CandlestickRenderer, HighLowItemLabelGenerator

0

Jako nowy użytkownik forum witam wszystkich.
Programowanie w Java zgłębiam od niedawna.
Piszę aplikację pobierającą dane z API brokera Forex, analizującą dane OHLC (cena otwarcia, najwyższa, najniższa, zamknięcia) i generującą wybrany fragment wykresu świecowego.
Do wykresów używam JFreeChart 1.5.0 oraz Swinga. Musiałem dodać do projektu też JFreeChart 1.0.19 bo w 1.5.0 nie ma chyba SegmentedTimeline.newMondayThroughFridayTimeline().
Mam gotową działającą aplikację - ściąga i aktualizuje dane, zapisuje na dysku, generuje i wyświetla wykresy.
Jest jednak problem z dodaniem etykiet dla poszczególnych świeczek.
Zrobiłem na wzór HighLowItemLabelGenerator swoją klasę z działającą metodą generateToolTip ale użycie metody generateLabel nie daje efektu.

public class LabelGenerator implements XYItemLabelGenerator, 
XYToolTipGenerator, Cloneable, PublicCloneable, Serializable {

Przerobienie klasy CandlestickRenderer na wzór AbstractXYItemRenderer przez dodanie metod drawItemLabel i generateLabel też nie zadziałało.

public class MyCandleRenderer extends AbstractXYItemRenderer
		implements XYItemLabelGenerator, XYItemRenderer, Cloneable, PublicCloneable, Serializable {

Proszę o sugestie jak zmusić CandlestickRenderer do wyświetlania "Label" dla pojedynczych elementów.
Jak nie wyjdzie z Label będę próbował z Annotation.
Poniżej fragment "opornego" kodu i screen aplikacji.

	public static JFreeChart createChart(String symbol, ChartDataset dataset) {
		JFreeChart chart = ChartFactory.createCandlestickChart(symbol, "", "", dataset, false);
		XYPlot plot = (XYPlot) chart.getXYPlot();
		plot.setOrientation(PlotOrientation.VERTICAL);
		plot.setBackgroundPaint(Color.getHSBColor(0.63f, 0.0f, 0.25f));
		plot.setRangeGridlinePaint(Color.GRAY);
		ValueAxis valueAxis = plot.getRangeAxis();
		valueAxis.setRange(dataset.min, dataset.max);
		valueAxis.setVerticalTickLabels(false);
		DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
		SegmentedTimeline timeline = SegmentedTimeline.newMondayThroughFridayTimeline();
		dateAxis.setTimeline(timeline);
		MyCandleRenderer renderer = new MyCandleRenderer();
		DateFormat patern = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		LabelGenerator generator = new LabelGenerator(patern, new DecimalFormat("0.00000"));
		renderer.setDefaultToolTipGenerator(generator);
		renderer.setDefaultItemLabelGenerator(generator);
		renderer.setDefaultItemLabelFont(new Font("Serif", Font.PLAIN, 20));
		renderer.setDefaultItemLabelPaint(Color.green.darker());
		renderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
		renderer.setAutoWidthMethod(MyCandleRenderer.WIDTHMETHOD_AVERAGE);
		renderer.setDefaultItemLabelsVisible(true);
		plot.setRenderer(renderer);
		return chart;
	}

screenshot-20180510235652.png

0

Problem rozwiązałem - skutecznie choć może niezbyt elegancko ;-)
Zmieniony CandleRenderer zawiera metodę rysującą świeczki (drawItem).
Dodałem do niej odwołanie do metody rysującej etykiety (drawItemLabel).

screenshot-20180511192511.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1