IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

ArrayIndexOutOfBoundsException et JTextPane


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut ArrayIndexOutOfBoundsException et JTextPane
    Bonjour,

    Je suis tombé sur un problème bizarre : j'obtiens une exception ArrayIndexOutOfBoundsException en collant un texte particulier dans un simple JTextPane.

    J'ai fait un tout petit exemple qui permet de reproduire le problème : la classe crée une simple JFrame avec un JTextPane vide. Quand je copie un texte particulier (des caractères Unicode un peu particuliers) dans le JTextPane, j'obtiens l'ArrayIndexOutOfBoundsException.

    Le texte que j'essaye de copier ressemble à [[ml:ഇംഗ്ലണ്ട്* ഫുട്ബോൾ ടീം]] (mais il faut récupérer le texte original sur http://fr.wikipedia.org/w/index.php?...on&action=edit car le copier/coller du texte dans le forum a l'air de le modifier et le problème ne se produit plus avec ce texte modifié...)

    Le point clé semble l'appel à UIManager.setLookAndFeel() : sans, ça marche.

    Quelqu'un aurait une idée ?

    J'ai ouvert aussi un post sur le forum Java: http://forums.sun.com/thread.jspa?th...45189&tstart=0


    Mon PC est sous Windows XP SP3, Java 6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    package org.wikipediacleaner.gui.swing;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
     
     
    /**
     * Simple test with JTextPane
     */
    public class JTextPaneTest extends JPanel {
     
      private static final long serialVersionUID = 6426424812124490870L;
     
      private JTextPane textNewSection;
     
      public JTextPaneTest() {
        setLayout(new BorderLayout());
        add(createTextPane(), BorderLayout.CENTER);
      }
     
      private Component createTextPane() {
        textNewSection = new JTextPane();
        textNewSection.setBackground(Color.WHITE);
        textNewSection.setEditable(true);
        JScrollPane scrollContents = new JScrollPane(textNewSection);
        scrollContents.setMinimumSize(new Dimension(100, 100));
        scrollContents.setPreferredSize(new Dimension(1000, 500));
        scrollContents.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        return scrollContents;
      }
     
      static void createAndShowGui() {
        JFrame frame = new JFrame("JTextPane test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JTextPaneTest());
        frame.pack();
        frame.setVisible(true);
      }
     
      public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
     
          public void run() {
            try {
              UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException e) {
              // TODO
            } catch (InstantiationException e) {
              // TODO
            } catch (IllegalAccessException e) {
              // TODO
            } catch (UnsupportedLookAndFeelException e) {
              // TODO
            }
            createAndShowGui();
          }
        });
      }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 234
    	at sun.font.ExtendedTextSourceLabel.getLineBreakIndex(ExtendedTextSourceLabel.java:442)
    	at java.awt.font.TextMeasurer.calcLineBreak(TextMeasurer.java:308)
    	at java.awt.font.TextMeasurer.getLineBreakIndex(TextMeasurer.java:544)
    	at java.awt.font.LineBreakMeasurer.nextOffset(LineBreakMeasurer.java:340)
    	at java.awt.font.LineBreakMeasurer.nextLayout(LineBreakMeasurer.java:422)
    	at javax.swing.text.TextLayoutStrategy.sync(TextLayoutStrategy.java:298)
    	at javax.swing.text.TextLayoutStrategy.insertUpdate(TextLayoutStrategy.java:52)
    	at javax.swing.text.FlowView.loadChildren(FlowView.java:126)
    	at javax.swing.text.CompositeView.setParent(CompositeView.java:122)
    	at javax.swing.text.FlowView.setParent(FlowView.java:272)
    	at javax.swing.text.CompositeView.replace(CompositeView.java:200)
    	at javax.swing.text.BoxView.replace(BoxView.java:164)
    	at javax.swing.text.CompositeView.loadChildren(CompositeView.java:97)
    	at javax.swing.text.CompositeView.setParent(CompositeView.java:122)
    	at javax.swing.plaf.basic.BasicTextUI$RootView.setView(BasicTextUI.java:1315)
    	at javax.swing.plaf.basic.BasicTextUI.setView(BasicTextUI.java:681)
    	at javax.swing.plaf.basic.BasicTextUI.modelChanged(BasicTextUI.java:670)
    	at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.insertUpdate(BasicTextUI.java:1841)
    	at javax.swing.text.AbstractDocument.fireInsertUpdate(AbstractDocument.java:185)
    	at javax.swing.text.AbstractDocument.handleInsertString(AbstractDocument.java:734)
    	at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:693)
    	at javax.swing.text.AbstractDocument.replace(AbstractDocument.java:655)
    	at javax.swing.JTextPane.replaceSelection(JTextPane.java:178)
    	at javax.swing.JTextPane.replaceSelection(JTextPane.java:162)
    	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.handleReaderImport(BasicTextUI.java:2341)
    	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.importData(BasicTextUI.java:2482)
    	at javax.swing.TransferHandler.importData(TransferHandler.java:745)
    	at javax.swing.plaf.basic.BasicTextUI$TextTransferHandler.importData(BasicTextUI.java:2419)
    	at javax.swing.TransferHandler$TransferAction.actionPerformed(TransferHandler.java:1655)
    	at javax.swing.text.JTextComponent.invokeAction(JTextComponent.java:1485)
    	at javax.swing.text.JTextComponent.paste(JTextComponent.java:1463)
    	at javax.swing.text.DefaultEditorKit$PasteAction.actionPerformed(DefaultEditorKit.java:1337)
    	at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1636)
    	at javax.swing.JComponent.processKeyBinding(JComponent.java:2844)
    	at javax.swing.JComponent.processKeyBindings(JComponent.java:2879)
    	at javax.swing.JComponent.processKeyEvent(JComponent.java:2807)
    	at java.awt.Component.processEvent(Component.java:5815)
    	at java.awt.Container.processEvent(Container.java:2058)
    	at java.awt.Component.dispatchEventImpl(Component.java:4410)
    	at java.awt.Container.dispatchEventImpl(Container.java:2116)
    	at java.awt.Component.dispatchEvent(Component.java:4240)
    	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848)
    	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693)
    	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958)
    	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830)
    	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657)
    	at java.awt.Component.dispatchEventImpl(Component.java:4282)
    	at java.awt.Container.dispatchEventImpl(Container.java:2116)
    	at java.awt.Window.dispatchEventImpl(Window.java:2429)
    	at java.awt.Component.dispatchEvent(Component.java:4240)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Chez moi ça marche. Enfin... ça ne m'envoie pas d'erreur
    ça m'affiche des carrés

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Chez moi ça marche. Enfin... ça ne m'envoie pas d'erreur
    ça m'affiche des carrés
    En fait, je viens aussi de réessayer avec le texte dans mon premier post et çà marche (des carrés aussi, classique).
    Par contre, si je recopie le texte original qui se trouve à http://fr.wikipedia.org/w/index.php?...on&action=edit j'ai l'exception.
    Est-ce que ça t'embêterait de retester en copiant depuis la page sur Wikipédia ?

    Mon L&F est com.sun.java.swing.plaf.windows.WindowsLookAndFeel, sous Windows XP SP3, Java 1.6.0_21

    Merci

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Effectivement avec le texte original j'ai une erreur.
    info : Même L&F que toi sous windows 7

    Il ne doit pas prendre en compte le caractère 234 ( et les suivants )
    Pour palier au problème il faudrait peut-être changer L&F ou alors vérifier le caractère à ajouter et le remplacer par un "carré" s'il n'est pas pris en compte par le L&F.

    Edit : Ou peut être en utilisant le langage html pour écrire les caractère spéciaux

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    J'aurais plutôt tendance à dire que la police utilisée ne supporte pas de tels caractères. EN effet un bon paquet des sets de police supportent un set limité de caractères. De fait il te faudrait te limiter aux polices dont tu es sûr.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Bonjour et merci pour les réponses.

    Je ne peux malheureusement pas modifier le texte pour remplacer les caractères qui posent problème par autre chose : mon outil permet de mettre à jour des pages sur Wikipédia, il faut donc que je conserve les caractères initiaux.

    Pour la police de caractères, il faudrait que je vois si parmi les polices Java standards il y en a une qui marche avec un rendu pas trop déconnant. Mais je doute que parmi ces rares polices il y en ait une seule qui gère tous les caractères (mais tant que ça affiche un carré sans planter, ça me va).

    J'ai fait un bug report sur le site de Oracle/Sun, je vais bien voir si j'obtiens une réponse...

Discussions similaires

  1. [JTextPane] Extraire un mot
    Par doudine dans le forum Composants
    Réponses: 3
    Dernier message: 21/04/2012, 22h11
  2. [Swing] Centré un texte dans un JTextPane
    Par titi_22 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 24/06/2011, 16h09
  3. [Lien hypertexte]Mettre un lien dans un JTextPane
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 23/05/2004, 19h20
  4. [JTextPane] saut de ligne...
    Par neric dans le forum Composants
    Réponses: 2
    Dernier message: 21/01/2004, 15h01
  5. Scroll automatique dans un JTextPane
    Par regbegpower dans le forum Composants
    Réponses: 9
    Dernier message: 11/11/2003, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo