Maison >Java >javaDidacticiel >Comment mettre à jour en toute sécurité la série JFreeChart à partir d'un fil de discussion en arrière-plan ?

Comment mettre à jour en toute sécurité la série JFreeChart à partir d'un fil de discussion en arrière-plan ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-16 11:29:14324parcourir

How to Safely Update JFreeChart Series from a Background Thread?

Erreurs inattendues lors de la modification d'une série avec JFreeChart

Problème :
Dans une tentative de mise à jour dynamique d'un JFreeChart plot, un utilisateur a rencontré des exceptions « Index de série hors limites » et « Index hors limites » en essayant de modifier le ensemble de données dans un thread d'arrière-plan.

Cause première :
Le problème était que l'ensemble de données était modifié directement à partir d'un thread d'arrière-plan, ce qui n'est pas une opération thread-safe.

Résolution :
Pour garantir des mises à jour sécurisées pour les threads, l'utilisateur doit utiliser un SwingWorker. Cette classe fournit un moyen sûr de mettre à jour l'interface graphique à partir des threads d'arrière-plan en mettant à jour l'ensemble de données dans la méthode process(), qui est invoquée sur le thread de répartition d'événements (EDT).

Solution alternative :
Pour les situations où l'axe X représente un nombre ou un nombre d'itérations plutôt que le temps, NumberAxis doit être utilisé à la place de DateAxis. Ce changement permet également de mettre à jour le tracé à mesure que les calculs sont terminés, plutôt qu'à intervalles de temps fixes.

Exemple d'implémentation de code :

private XYSeries series = new XYSeries("Result");
...
@Override
protected void process(List<Double> chunks) {
    for (double d : chunks) {
        label.setText(df.format(d));
        series.add(++n, d);
    }
}

Dans ce code, le La méthode process() est utilisée pour mettre à jour en toute sécurité l'ensemble de données XYSeries sur l'EDT à mesure que de nouvelles données deviennent disponibles. Le XYLineAndShapeRenderer est configuré pour restituer les formes de la première série, rendant les points visibles sur le tracé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn