Анимированый график - Java
Формулировка задачи:
Здравствуйте, допустим у меня есть график. Что использовать чтобы каждая точка рисовалась раз в полсекунды - тоесть что-то вроде анимации. В качестве библиотеки использую JFreeChart. В данном коде то, что я набросал - но, при создании следующей точки идет конфликт, так - как в JFreeChart не разрешается 2 однаковых серии. Делал изменение названия серии,но тогда выходит не то что нужно. Может посоветуете другую библиотеку?
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
XYSeriesCollection dataset = new XYSeriesCollection();
t = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
count ++;
x++;
y++;
Text.setText(Integer.toString(count));
series.add(x, Math.sin(y));
dataset.addSeries(series);
}
});
t.start();
JFreeChart chart1 = ChartFactory.createXYLineChart(
"1",
"х",
"у",
dataset,
PlotOrientation.VERTICAL,
false, false, false);
ChartPanel CP = new ChartPanel(chart1);
XYPlot plot = chart1.getXYPlot();
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesLinesVisible(1, true);//тільки точки
renderer.setSeriesShapesVisible(1, true);
plot.setRenderer(renderer);
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel1.add(CP,BorderLayout.CENTER);
jPanel1.validate();
}Решение задачи: «Анимированый график»
textual
Листинг программы
private double f(double x, double v){
return (v / x - v * v);
}
XYChart.Series series = new XYChart.Series();
XYChart.Series series1 = new XYChart.Series();
XYChart.Series series2 = new XYChart.Series();
XYChart.Series series3 = new XYChart.Series();
private void longProcess(){
this.text.setText(Integer.toString(digitCount++));
while(x <= counter % 10){
vnew = v + f(x,v) * dx;
ynew = y + vnew * dx;
y = ynew;
v = vnew;
if (h % 70 == 0)
{
this.series.getData().addAll(new XYChart.Data(Double.toString(x), y));
this.series2.getData().addAll(new XYChart.Data(Double.toString(x), v));
this.series3.getData().addAll(new XYChart.Data(Double.toString(v), y));
}
this.series1.getData().addAll(new XYChart.Data(Double.toString(x), Math.log(x*x/4) * Math.log(Math.exp(1))+2));
x += dx;
h++;
}
counter = counter + 0.1;
}
protected AnimationTimer at = new AnimationTimer(){
long lastUpdate = 0;
@Override
public void handle(long now) {
if (now - lastUpdate >= 20000000) {
longProcess();
lastUpdate = now;
}
}
};
public void start(){
at.start();
this.graf.getData().addAll(series);
this.graf.getData().addAll(series1);
graf.setCreateSymbols(false);
graf.getCreateSymbols();
this.graf1.getData().addAll(series2);
this.graf2.getData().addAll(series3);
}
public void stop(){
at.stop();
}