I wrote this code for a candlestickChart with two plots on it(price and buy/sell signals) and I tried to add a scrollbar like an example that i saw on this forum. I have a serie with 1000 items, but on the chart i want to see about 100 items and move the chart thanks to a scrollbar. With this code i see the scrollbar and all 1000 values, instead of only 100 values, and moving the scrollbar the chart doesn't move. (sorry for my bad english)
Can someone help me? Thanks in advance
Code: Select all
package chart;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.SegmentedTimeline;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.CandlestickRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.RefineryUtilities;
import java.awt.*;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
public class CandlestickChart extends JFrame {
final int maxdays = 100;
public CandlestickChart(LinkedList<day.Day> list, String title){
super(title + ": Chart + Buy/Sell signals");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Shared date axis
DateAxis domainAxis = new DateAxis("Date");
domainAxis.setTickMarkPosition( DateTickMarkPosition.START );
domainAxis.setTimeline( SegmentedTimeline.newMondayThroughFridayTimeline() );
domainAxis.setDateFormatOverride(new SimpleDateFormat("dd-MM-yy"));
//Build Candlestick Chart based on stock price OHLC
OHLCDataset priceDataset = getPriceDataSet(title,list);
NumberAxis priceAxis = new NumberAxis("Price");
CandlestickRenderer priceRenderer = new CandlestickRenderer();
XYPlot pricePlot = new XYPlot(priceDataset, domainAxis, priceAxis, priceRenderer);
priceRenderer.setSeriesPaint(0, Color.BLACK);
priceRenderer.setDrawVolume(true);
priceAxis.setAutoRangeIncludesZero(false);
OHLCDataset signalDataset = getSignalDataSet(title,list);
NumberAxis signalAxis = new NumberAxis("Signal");
CandlestickRenderer signalRenderer = new CandlestickRenderer();
XYPlot signalPlot = new XYPlot(signalDataset, domainAxis, signalAxis, signalRenderer);
signalRenderer.setSeriesPaint(0, Color.BLACK);
signalRenderer.setDrawVolume(false);
signalAxis.setAutoRangeIncludesZero(true);
//Build Combined Plot
CombinedDomainXYPlot mainPlot = new CombinedDomainXYPlot(domainAxis);
mainPlot.add(pricePlot,4);
mainPlot.add(signalPlot,1);
JFreeChart chart = new JFreeChart(title, null, mainPlot, false);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setSize(600,600);
chartPanel.setVisible(true);
this.add(chartPanel);
this.add(getScrollBar(domainAxis), BorderLayout.SOUTH);
this.pack();
RefineryUtilities.centerFrameOnScreen(this);
}
private OHLCDataset getPriceDataSet(String symbol, LinkedList<day.Day> list) {
List<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
int counter = 0;
ListIterator<day.Day> it = list.listIterator(list.size());
while(it.hasPrevious() && counter<maxdays){
day.Day day = it.previous();
OHLCDataItem item = new OHLCDataItem(day.id, day.open, day.max, day.min, day.close, day.vol);
dataItems.add(item);
counter++;
}
OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);
return new DefaultOHLCDataset(symbol, data);
}
private OHLCDataset getSignalDataSet(String symbol, LinkedList<day.Day> list) {
List<OHLCDataItem> dataItems = new ArrayList<OHLCDataItem>();
int counter = 0;
ListIterator<day.Day> it = list.listIterator(list.size());
while(it.hasPrevious() && counter<maxdays){
day.Day day = it.previous();
if(day.signalType>0){
OHLCDataItem item = new OHLCDataItem(day.id, 0, day.signalType, 0, day.signalType, 0);
dataItems.add(item);
} else if(day.signalType<0){
OHLCDataItem item = new OHLCDataItem(day.id, 0, 0, day.signalType, day.signalType, 0);
dataItems.add(item);
}
counter++;
}
OHLCDataItem[] data = dataItems.toArray(new OHLCDataItem[dataItems.size()]);
return new DefaultOHLCDataset(symbol, data);
}
private JScrollBar getScrollBar(final DateAxis domainAxis){
final double r1 = domainAxis.getLowerBound();
final double r2 = domainAxis.getUpperBound();
JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 100, 0, 400);
scrollBar.addAdjustmentListener( new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
double x = e.getValue() *60 *60 * 1000;
domainAxis.setRange(r1+x, r2+x);
}
});
return scrollBar;
}
}