J'ai une application qui met à jour une variable environ entre 5 et 50 fois par seconde et je cherche un moyen de tracer un tracé XY continu de ce changement en temps réel.Graphiques en temps réel en Java
Bien que JFreeChart ne soit pas recommandé pour un taux de mise à jour aussi élevé, de nombreux utilisateurs disent toujours que cela fonctionne pour eux. J'ai essayé d'utiliser this démo et l'ai modifié pour afficher une variable aléatoire, mais il semble utiliser jusqu'à 100% d'utilisation du processeur tout le temps. Même si j'ignore cela, je ne veux pas être limité à la classe d'interface utilisateur de JFreeChart pour la construction de formulaires (même si je ne suis pas sûr de ses capacités). Serait-il possible de l'intégrer avec les "formulaires" de Java et les menus déroulants? (comme disponible en VB) Sinon, y a-t-il des alternatives que je pourrais examiner?
EDIT: Je suis nouveau Swing, donc je l'ai mis en place un code juste pour tester la fonctionnalité de JFreeChart avec elle (tout en évitant l'utilisation de la classe ApplicationFrame de JFree puisque je ne suis pas sûr cela fonctionnera avec les combos et les boutons de Swing). À l'heure actuelle, le graphique est mis à jour immédiatement et l'utilisation du processeur est élevée. Serait-il possible de mettre en mémoire tampon la valeur avec la nouvelle milliseconde() et de la mettre à jour peut-être deux fois par seconde? Puis-je ajouter d'autres composants au reste de JFrame sans perturber JFreeChart? Comment ferais-je cela? frame.getContentPane(). add (new Button ("Click")) semble écraser le graphique.
package graphtest;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
public class Main {
static TimeSeries ts = new TimeSeries("data", Millisecond.class);
public static void main(String[] args) throws InterruptedException {
gen myGen = new gen();
new Thread(myGen).start();
TimeSeriesCollection dataset = new TimeSeriesCollection(ts);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"GraphTest",
"Time",
"Value",
dataset,
true,
true,
false
);
final XYPlot plot = chart.getXYPlot();
ValueAxis axis = plot.getDomainAxis();
axis.setAutoRange(true);
axis.setFixedAutoRange(60000.0);
JFrame frame = new JFrame("GraphTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ChartPanel label = new ChartPanel(chart);
frame.getContentPane().add(label);
//Suppose I add combo boxes and buttons here later
frame.pack();
frame.setVisible(true);
}
static class gen implements Runnable {
private Random randGen = new Random();
public void run() {
while(true) {
int num = randGen.nextInt(1000);
System.out.println(num);
ts.addOrUpdate(new Millisecond(), num);
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
System.out.println(ex);
}
}
}
}
}
Cela semble être une bonne idée, mais je dois tampon une sorte d'horodatage aussi bien. Cependant, JFreeChart semble prendre 100% de l'utilisation du processeur si j'ai 2 ou 50 mises à jour chaque seconde. – thodinc
Eh bien, ça fait pas mal - régénérer le graphique à chaque fois. Donc, je recommanderais une mise à jour un peu moins fréquente (bien sûr cela dépend de votre machine et de votre charge supplémentaire ...) –