Accueil > Projets > ScientificPad / MathMLPad [fr] > Comment insérer un tableau / une table dans un JTextPane ou JEditorPane ! (...)

Comment insérer un tableau / une table dans un JTextPane ou JEditorPane ! - Tables in the JEditorPane or JTextPane.

Travail sur deux bugs Java.

dimanche 20 mai 2012, par ScientificWare

En souhaitant intégrer la gestion des tableaux / tables dans ScientificPad, j’ai effectivement été rapidement confronté à un problème de dysfonctionnement de l’API en charge de leur affichage. Il apparait que deux bugs persistent / persistaient dans l’API javax.swing.text.

La complexité de l’API javax.swing.text fait que peu de développeurs l’utilisent dans son intégralité et se contentent des fonctions de base. Certains la contournent en recréant de toute pièce des éléments existants.

En particulier l’insertion d’un tableau ou d’une table dans JTextPane ou JEditorPane est possible mais n’a jamais été détaillée dans la littérature sur Java. On trouve une solution sur internet comme celle de Stanislav Lapitsky mais comme je l’ai indiqué précédemment c’est une réécriture complète d’une solution déjà existante.

C’est sans doute pour cette raison que ces deux bugs sont encore présents. Ils font l’objet de cinq rapports que j’ai adressés à Oracle :

 le 2011-09-29 JDK-7072926 Défaut de mise à jour de largeur. Petite anomalie détectée sur l’affichage d’un tableau. Je réalise à cette occasion une petite démonstration (le code qui est donné en exemple ici). Un petit bout de programme juste pour montrer quel est le problème.


 le 2012-05-18 JDK-7169915 Défaut de peinture des cellules. Nouveau bug. Les bug signalés sont traités par priorité. Pour accélérer le processus, j’identifie l’origine des deux problèmes et je propose une solution.


 JDK 7180096 Réponse à la fermeture du précédent dossier. Tentative de relance des bugs précédents suite à la fin de non recevoir des précédents rapports. Sans succès. Les développeurs de l’OpenJDK consultés par Oracle à ce sujet sont dubitatifs par rapport aux corrections que j’apporte au code.
 le 2015-08-08 JDK-8133864 Wrong display, when the document I18n properties is true.. C’est finalement, un nouveau bug qui va déclencher la prise en charge d’une partie de mes diverses demandes. L’affichage des tableaux n’est pas le même suivant que l’on se trouve en mode i18n ou pas. Selon mon rapport, les liens entre certains vues sont rompus en mode i18n. Or les développeurs de Java n’aiment pas trop cette situation, à savoir les différences de comportement entre deux classes censées donner le même résultat. La solution est fournie par l’équipe d’OpenJDK. Le code que j’avais envoyé en 2011 et qui est le sujet de cette page a été intégré dans l’OpenJDK en servant de base à un test sur les tableaux.
 le 2016-05-27 JDK-8158209 Editing in TableView breaks the layout, when the document is I18n Une nouvelle occasion se présente lors du passage de la version Java 8 à Java 9 (version développement). Le problème sera résolu par JDK-8158924 (voir rapport suivant) : L’affichage des tableaux est de nouveau perturbé. Je le signale. Le test créé pour JDK-8133864 le met bien en évidence. Je profite également de ce rapport pour demander une nouvelle expertise des modifications que j’avais suggérées en 2012.
 le 2016-06-07 JDK-8158924 Incorrect i18n text document layout.. Mon rapport JDK-8158209 mentionnait une différence d’affichage en mode i18n pour le tableau. En fait, il s’agissait d’un bug introduit lors du remplacement d’ICU par Harfbuzz. Par contre, pas de nouvelle concernant JDK-7072926 et JDK-7169915.
 le 2017-01-29 et le 2017-02-26. Oracle lance des appels pour que les développeurs commencent à tester la version de développement de Java 9. La sortie de Java 9 est programmée pour juillet 2017. Il serait dommage qu’une nouvelle version sortent sans mes correctifs. Donc nouveaux appels à l’équipe d’OpenJDK, en espérant que quelqu’un consacre un tout petit peu de son son temps à JDK-7072926 et JDK-7169915. D’autant plus que les tests que l’on me demandait sont réalisés et montrent bien l’efficacité de mes PATCH.
 le 2017-02-27 : Le deuxième est le bon. « Hi. Your evaluation and the fix seems reasonable. If you already signed the OCA[1] then I can place your webrev to the cr.openjdk for official review request.. »
« Hi, Thank you very much !
Yes I already signed the OCA few years ago for the NetBeans project.
I’m the fourth person on the list : Abossolo Foh Guy.
Best regards. »
 le 2017-03-16, JDK-8158209 passe en Statut "Resolved" et les modifications sont disponibles dans la version Java 9 b161.
 le 2017-03-16 JDK-8177009 Editing in TableView breaks the layout, when the document is I18n. Les modifications sont aussi intégrées à OpenJDK 10 (base pour Java 10).

« With great thanks to Victor, Alexandr, Semyon and specialy Sergey for his sponsoring. »

Le commit dans le nouveau dépot git d’OpenJDK 8158209 : Editing in TableView breaks the layout, when the document is…


Le deuxième rapport contient une proposition de résolution de ces problèmes d’où le nouveau titre de cet article.

Comment insérer un tableau / une table dans un JTextPane ou JEditorPane !

Testez par vous-même la différence entre la version originale et la version corrigée de TabView.

À partir de Java 9, sous réserve que mes correctifs ne soient pas retirés, les deux programmes ci-dessous devraient donner exactement le même résultat.

Le programme avec les bugs

Le programme sans les bugs

Le texte ci-dessous a été saisi dans le programme de test puis copié ici grâce à ctrl-c et ctrl-v.

« Illustration des possibilités de l’API javax.swing.text.

Elle est basée sur un petit programme de test réalisé pour la démonstration du problème et la présentation de la solution adoptée.
Les codes sont disponibles sur les rapports de bug : www.oracle.com bug Id : 7169915 et bug Id : 7072926.

Il ne comporte pas toutes les fonctionnalités d’un vrai traitement de texte.

Cependant, on peut copier et coller avec les raccourcis ctrl-c et ctrl-v. »

Ce code peut toutefois servir d’exemple sur l’insertion d’un tableau / d’une table dans un composant texte JEditorPane ou JTextpane à l’aide de la classe TableView. Les exemples trouvés sur internet sont peu satisfaisants.

« Contrairement à beaucoup de traitement de texte, le tableau peut être inclus dans le flux du texte.
Chaque cellule peut comporter plusieurs lignes.
Cela représente 300 lignes de code.

Cordialement. »

  1. Télécharger NetBeans Ide,
  2. Ouvrir un nouveau projet : File - New Project - Categories Java - Projects Java Application, Next - Project Name TextTableDemo, Finish,
  3. Dans ce nouveau projet, créer les deux classes données dans le rapport. Pour chaque classe cliquez droit sur le nom du projet : New - Java Class, Copier le code,
  4. Cliquez droit sur le nom du projet puis sur run.

Pour toute question : Publications@ScientificWare.com.

Portfolio