📄 datescrollbar.java
字号:
/*
* ChartScrollBar.java
*
*/
package com.jsystemtrader.chart;
/**
*
*/
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.event.*;
import org.jfree.chart.plot.*;
import org.jfree.data.*;
import org.jfree.data.xy.*;
public class DateScrollBar extends JScrollBar implements AdjustmentListener, AxisChangeListener {
private static final int STEPS = 10000;
private final DateAxis dateAxis;
private final ValueAxis rangeAxis;
private final Range range;
private double rangeMin, rangeMax, dateRange, ratio;
private OHLCDataset dataset;
public DateScrollBar(XYPlot plot) {
super(HORIZONTAL);
dateAxis = (DateAxis) plot.getDomainAxis();
rangeAxis = plot.getRangeAxis();
range = plot.getDataRange(dateAxis);
dataset = (OHLCDataset) plot.getDataset();
dateAxis.addChangeListener(this);
addAdjustmentListener(this);
axisChanged(null);
adjustmentValueChanged(null);
}
private void rangeUpdate() {
ArrayList<Double> xValues = new ArrayList<Double> ();
int count = dataset.getItemCount(0);
for (int item = 0; item < count; item++) {
xValues.add(dataset.getXValue(0, item));
}
int firstItem = findItemIndex(xValues, dateAxis.getLowerBound(), count);
int lastItem = findItemIndex(xValues, dateAxis.getUpperBound(), count);
double max = dataset.getHighValue(0, firstItem);
double min = dataset.getLowValue(0, firstItem);
for (int item = firstItem; item <= lastItem; item++) {
double high = dataset.getHighValue(0, item);
if (high > max) {
max = high;
}
double low = dataset.getLowValue(0, item);
if (low < min) {
min = low;
}
}
rangeAxis.setRange(min, max);
}
public void axisChanged(AxisChangeEvent event) {
Timeline timeLine = dateAxis.getTimeline();
rangeMin = timeLine.toTimelineValue( (long) range.getLowerBound());
rangeMax = timeLine.toTimelineValue( (long) range.getUpperBound());
long dateMin = timeLine.toTimelineValue( (long) dateAxis.getLowerBound());
long dateMax = timeLine.toTimelineValue( (long) dateAxis.getUpperBound());
dateRange = dateMax - dateMin;
ratio = STEPS / (rangeMax - rangeMin);
int newExtent = (int) (dateRange * ratio);
int newValue = (int) ( (dateMin - rangeMin) * ratio);
setValues(newValue, newExtent, 0, STEPS);
}
public void adjustmentValueChanged(AdjustmentEvent e) {
long start = (long) (getValue() / ratio + rangeMin);
long end = (long) (start + dateRange);
if (end > start) {
Timeline timeLine = dateAxis.getTimeline();
start = timeLine.toMillisecond(start);
end = timeLine.toMillisecond(end);
}
dateAxis.setRange(start, end);
rangeUpdate();
}
private int findItemIndex(ArrayList<Double> values, double value, int maxCount) {
int itemIndex = Collections.binarySearch(values, value);
if (itemIndex < 0) {
itemIndex = -itemIndex - 1;
}
itemIndex = Math.max(0, Math.min(itemIndex - 1, maxCount - 1));
return itemIndex;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -