Я пытаюсь динамически обновлять основные данные серии диаграмм, но ScrollPager замерзает рамку моего графика, если я перемещаю ColorBand или обновляю диаграмму, пока она уже перерисовывается с помощью множества исключений ArrayOutOfIndex. Я понимаю, почему это происходит, но не знаю, как правильно использовать его с TeeChart. Есть ли какое-то решение, которое я мог бы синхронизировать правильно?Обновление в реальном времени TeeChart ScrollPager
Вот мой пример кода с использованием летучих, он имитирует обновление серии с заполнением его со значением образца:
public class TestTeeChartCandle extends JFrame {
int sizeX = 500;
int sizeY = 500;
private TChart chart;
private Candle series;
private MyScrollPager scrollPager;
private volatile boolean updatingChart = false;
private volatile boolean updatingSubChart = false;
private volatile boolean updatingChartSeries = false;
private volatile boolean updatingSubChartSeries = false;
private volatile boolean updatingData = false;
private volatile boolean draggingSubChart = false;
public TestTeeChartCandle() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(520, 520));
chart = new TChart();
chart.setPreferredSize(new Dimension(500, 500));
series = new Candle(chart.getChart());
series.fillSampleValues(500);
scrollPager = new MyScrollPager(chart.getChart());
ChangeEvent changeEvent = new ChangeEvent(null);
scrollPager.dragMoving(changeEvent);
MouseMoveListener mouseMoveListener = new MouseMoveListener();
scrollPager.getColorBandTool().addMouseMotionListener(mouseMoveListener);
this.addComponentListener(new ComponentListener() {
public void componentResized(ComponentEvent e) {
sizeX = e.getComponent().getWidth();
sizeY = e.getComponent().getHeight();
setPreferredSize(new Dimension(sizeX, sizeY));
}
public void componentMoved(ComponentEvent e) {
}
public void componentHidden(ComponentEvent e) {
}
public void componentShown(ComponentEvent e) {
}
});
chart.addChartPaintListener(new ChartPaintAdapter() {
@Override
public void chartPainted(ChartDrawEvent e) {
updatingChart = false;
}
@Override public void chartPainting(ChartDrawEvent e) {
while (updatingData) ;
updatingChart = true;
}
@Override public void seriesPainted(ChartDrawEvent e) {
updatingChartSeries = false;
}
@Override public void seriesPainting(ChartDrawEvent e) {
while (updatingData) ;
updatingChartSeries = true;
}
});
scrollPager.getSubChartTChart().addChartPaintListener(new ChartPaintAdapter() {
@Override
public void chartPainted(ChartDrawEvent e) {
updatingSubChart = false;
}
@Override public void chartPainting(ChartDrawEvent e) {
while (updatingData) ;
updatingSubChart = true;
}
@Override public void seriesPainted(ChartDrawEvent e) {
updatingSubChartSeries = false;
}
@Override public void seriesPainting(ChartDrawEvent e) {
while (updatingData) ;
updatingSubChartSeries = true;
}
});
add(chart);
pack();
setVisible(true);
threadSleep(500);
}
public void drawChart() {
updatingData = true;
while (updatingChart && updatingSubChart
&& updatingChartSeries && updatingSubChartSeries
&& draggingSubChart) ;
scrollPager.getSubChartTChart().removeAllSeries();
scrollPager.setSeries(null);
series.beginUpdate();
if (scrollPager.getSeries() != null)
scrollPager.getSeries().beginUpdate();
series.fillSampleValues(500);
FastLine fl = new FastLine();
for (int j = 0; j < series.getCount(); j++)
fl.add(series.getDateValues().getValue(j), series.getCloseValues().getValue(j));
scrollPager.setSeries(fl);
series.endUpdate();
if (scrollPager.getSeries() != null)
scrollPager.getSeries().endUpdate();
int lastVisibleId = series.getCount() - 1;
if (lastVisibleId < 0)
lastVisibleId = 0;
int firstVisibleId = lastVisibleId - 100;
if (firstVisibleId < 0)
firstVisibleId = 0;
double last = series.getDateValues().getValue(lastVisibleId);
double first = series.getDateValues().getValue(firstVisibleId);
scrollPager.getColorBandTool().setStart(first);
scrollPager.getColorBandTool().setEnd(last);
chart.getAxes().getBottom().setMinMax(first, last);
updatingData = false;
pack();
while (updatingChart && updatingSubChart
&& updatingChartSeries && updatingSubChartSeries
&& draggingSubChart) ;
}
public static void main(String[] args) {
TestTeeChartCandle testTeeChartCandle = new TestTeeChartCandle();
while (true) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
testTeeChartCandle.drawChart();
}
}
public void threadSleep(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public class MyScrollPager extends ScrollPager implements com.steema.teechart.events.DragListener {
public MyScrollPager(com.steema.teechart.IBaseChart iBaseChart) {
super(iBaseChart);
}
@Override
public void dragFinished(com.steema.teechart.events.ChangeEvent changeEvent) {
draggingSubChart = false;
}
@Override
public void dragMoving(com.steema.teechart.events.ChangeEvent changeEvent) {
while (updatingData) ;
draggingSubChart = true;
}
}
}
Он не работает, даже если я устанавливаю адаптеры для обоих: диаграммы и подзаголовка прокрутки. Средство ColorBand от scrollpager не поддерживает MouseMotionAdapter в MouseMotionListener. – Ariloum
Я отредактировал ответ – Yeray
Есть ли способ проверить эту функциональность AllowMouse с промежуточной демо-версией для swing? – Ariloum