2015-03-10 10 views
0

Я пытаюсь динамически обновлять основные данные серии диаграмм, но 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; 
    } 

} 

}

ответ

1

насчет паузы нить, когда мышь перемещается на если данные обновляются?

tChart1.addMouseMotionListener(new MouseMotionAdapter() { 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      while (updatingData) ; 
     } 
    }); 

EDIT 1:

Мы расследовали это.
Пример повторяет серию так быстро, что она легко воспроизводит проблему; Это может быть не так легко в реальной ситуации.

Мы добавили AllowMouse свойство (общедоступный через по геттер и сеттер), true по умолчанию, что отключает любое событие мыши уволят на графике, когда это false. Это свойство позволит вам отключить события мыши на диаграмме, прежде чем изменять его, поэтому ColorBand в инструменте ScrollPager не будет работать, пока вы снова не вернете свойство AllowMouse в конце вашей процедуры модификации.


EDIT 2:

Мы сделали еще один тест демо мы делимся со всеми here.

Обратите внимание, что он не использует AllowMouse, но он не очищает серию каждый раз; вместо этого он добавляет/добавляет точки к настоящей серии, и он повторно использует серию в скроллере, а не переназначает ее каждый раз.
Это, с некоторыми дополнительными диапазонами и нулевыми проверками в источниках, делает тестовое приложение стабильным для нас здесь.

Обратите внимание, что цветная полоса становится меньше по мере того, как точки продолжают поступать; и если вы продолжаете добавлять точки, не удаляя никого и не изменяя нижнюю ось скроллера, он заканчивается на очень маленькой и почти непригодной цветовой полосе. В приведенном примере есть код, который через некоторое время удаляет первые точки.

Наконец, мы предлагаем добавить точки в более медленном интервале. Добавление большего количества точек было бы менее плавным, но было бы проще для пользователя поймать цветную полосу, перетащить или изменить ее размер.

+0

Он не работает, даже если я устанавливаю адаптеры для обоих: диаграммы и подзаголовка прокрутки. Средство ColorBand от scrollpager не поддерживает MouseMotionAdapter в MouseMotionListener. – Ariloum

+0

Я отредактировал ответ – Yeray

+0

Есть ли способ проверить эту функциональность AllowMouse с промежуточной демо-версией для swing? – Ariloum

Смежные вопросы