gpt4 book ai didi

java - TeeChart ScrollPager 实时更新

转载 作者:行者123 更新时间:2023-12-01 11:48:20 25 4
gpt4 key购买 nike

我正在尝试动态更新主图表系列数据,但如果我移动 ColorBand 或者在图表已经重新绘制并出现大量 ArrayOutOfIndex 异常时更新图表,ScrollPager 会卡住图表的框架。我理解为什么会发生这种情况,但不知道如何在 TeeChart 中正确使用它。有什么解决方案可以让它正确同步吗?

这是我使用 volatile 的代码示例,它通过填充示例值来模拟系列的更新:

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;
}

}

}

最佳答案

如果数据正在更新,当鼠标在图表上移动时暂停线程怎么样?

    tChart1.addMouseMotionListener(new MouseMotionAdapter() {

@Override
public void mouseMoved(MouseEvent e) {
while (updatingData) ;
}
});
<小时/>

编辑1:

我们一直在调查此事。
该示例重新填充该系列的速度非常快,因此很容易重现该问题;在真实情况下,这可能不会那么容易发生。

我们添加了 AllowMouse属性(通过相应的 getter 和 setter 公开访问),true默认情况下,当它是 false 时,将禁用在图表上触发任何鼠标事件。 。此属性允许您在修改图表之前禁用图表上的鼠标事件,因此 ColorBandScrollPager在您重新启用 AllowMouse 之前,该工具将无法工作在修改例程结束时再次属性。

<小时/>

编辑2:

我们制作了另一个测试演示,与大家分享 here

请注意,它不使用AllowMouse,但它不会每次都清除该系列;相反,它会向当前系列添加/追加点,并重用滚动条中的系列,而不是每次都重新分配它。
在源代码中进行一些额外的范围和空检查,使测试应用程序对我们来说稳定。

请注意,随着点不断到达,色带会变小;如果您继续添加点而不删除任何人,也不重新缩放滚动条的底部轴,它将以非常小的且几乎无法使用的色带结束。注释示例中的一些代码在一段时间后删除了第一个点。

最后,我们建议以较慢的间隔添加积分。不那么频繁地添加更多点会不太平滑,但会让用户更容易捕捉色带、拖动或调整其大小。

关于java - TeeChart ScrollPager 实时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com