Publié par

Il y a 9 ans -

Temps de lecture 3 minutes

Customiser les Tooltips JFreeChart

J’ai récemment eu quelques difficultés à customiser les styles (couleurs, fonts, …) des Tooltips générés par l’API JFreeChart.
Quelques recherches sur le sujet m’ont permis de constater que je n’étais pas le seul à rencontrer des difficultés pour modifier les styles par défaut fournis par l’API JFreeChart.
L’API JFreeChart étant assez mal documentée sur le sujet, j’ai du fouiller dans le code source de l’api pour trouver mon bonheur. Comme dit le proverbe, « Pour avoir de l’eau claire, il n’est que d’aller à la source ».
Ayant finalement trouvé une solution au problème, je me propose de la partager au travers de ce billet.

Les Tooltips avec JFreeChart

Les implémentations des Tooltips fournis par l’API JFreeChart sont basées sur l’interface ToolTipTagFragmentGenerator.

ToolTipTagFragmentGenerator.java

package org.jfree.chart.imagemap;

/**
  * Interface for generating the tooltip fragment of an HTML image map area tag.
  * The fragment should be XHTML 1.0 compliant.
 */
public interface ToolTipTagFragmentGenerator {

    /**
     * Generates a tooltip string to go in an HTML image map.
     * @param toolTipText  the tooltip.
     * @return The formatted HTML area tag attribute(s).
     */
    public String generateToolTipFragment(String toolTipText);

}

L’api JFreeChart fournit quelques implémentations de base :

  • StandardToolTipTagFragmentGenerator.java : Cette classe permet de générer un Tooltip en se basant sur les attributs alt et title.
package org.jfree.chart.imagemap;

/**
 * Generates tooltips using the HTML title attribute for image map area tags.
 */
public class StandardToolTipTagFragment... implements ToolTipTagFragmentGenerator {

    public String generateToolTipFragment(String toolTipText) {
        return " title=" + ImageMapUtilities.htmlEscape(toolTipText)
            + " alt=''";
    }
}
  • OverLIBToolTipTagFragmentGenerator.java : Cette classe utilise la libraire JavaScript overLIB pour générer un Tooltip avec un style par défaut.
package org.jfree.chart.imagemap;

/**
   * Generates tooltips using the OverLIB library
   * (http://www.bosrup.com/web/overlib/).
 */
public class OverLIBToolTipTagFragmentGenerator
        implements ToolTipTagFragmentGenerator {

    public String generateToolTipFragment(String toolTipText) {
        return " onMouseOver=return overlib('"
                + ImageMapUtilities.javascriptEscape(toolTipText)
                + "'); onMouseOut=return nd();";
    }

}

Quelques exemples de Tooltips avec overLIB

Le site de la libraire overLIB proposent de nombreux exemples d’utilisation dont :

  • Tooltip ordinaire avec le style fournis par JFreeChart :
tooltip
  • Tooltip personnalisé avec la librairie overLIB :
with overlib styles
  • Tooltip avec du html et du css :
with HTML

Solution

Une fois le mécanisme compris, tout ce qu’il reste à faire c’est s’inspirer de la classe OverLIBToolTipTagFragmentGenerator pour créer un générateur de Tooltips personnalisés.

J’ai pour ma part opté pour la solution FULLHTML dans laquelle la librairie overLIB gère uniquement les événements onmouseover et onmouseout, les styles et les couleurs sont appliqués directement dans le code HTML.

Je commence par créer mon générateur personnalisé CustomToolTipTagFragmentGenerator :

import org.jfree.chart.imagemap.ImageMapUtilities;
import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator;

public class CustomToolTipTagFragment... implements ToolTipTagFragmentGenerator {

   /**
      * Generates tooltips using the OverLIB library with FULLHTML option
      * (http://www.bosrup.com/web/overlib/).
     */
    public String generateToolTipFragment(String toolTipText) {
        String ret = " onMouseOver=return overlib('" + 
                         ImageMapUtilities.javascriptEscape(toolTipText)  + 
                         "', FULLHTML); onMouseOut=return nd();";

        return ret;
    }
}

Pour la génération du graphique, la classe ChartUtilities propose les méthodes suivantes :

public static  void writeImageMap(PrintWriter writer, String name, 
            ChartRenderingInfo info, ToolTipTagFragmentGenerator tooltipTagGen,
            URLTagFragmentGenerator urlTagGen)

Ou

public static String getImageMap(String name, ChartRenderingInfo info,
            ToolTipTagFragmentGenerator toolTipTagFragmentGenerator,
            URLTagFragmentGenerator urlTagFragmentGenerator)

Le code html permettant de générer le rendu du Tooltip est créé en implémentant l’interface StandardCategoryToolTipGenerator :

CustomValueToolTipGenerator.java

Class CustomValueToolTipGenerator extends StandardCategoryToolTipGenerator  {

        public String generateToolTip(CategoryDataset dataset, int row, int column) {
            StringBuilder toolTipHtml = new StringBuilder();
            toolTipHtml.append("");
            toolTipHtml.append("");
            toolTipHtml.append("");
            return toolTipHtml.toString();
        }
}

Une instance de cette classe doit être passée en paramètre de la méthode void setBaseToolTipGenerator(CategoryToolTipGenerator) de la classe AbstractCategoryItemRenderer.

Toutefois, si vous avez opté pour une utilisation des styles fournis par overLIB, la fonction generateToolTip doit se contenter de retourner le message à afficher dans le Tooltip.

En espérant que cette solution puisse vous aider !

Publié par

Commentaire

1 réponses pour " Customiser les Tooltips JFreeChart "

  1. Publié par , Il y a 9 ans

    Merci pour ce post,

    Actuellement je suis en difficulté pour créer une ImageMap pour un TimeTableXYDataset.
    En effet j’ai l’impression que ce n’est pas possible …

    Auriez vous des pistes ?

    Merci

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous recrutons

Être un Xebian, c'est faire partie d'un groupe de passionnés ; C'est l'opportunité de travailler et de partager avec des pairs parmi les plus talentueux.