précédent | suivant | table des matières

JEditorPane

Sommaire
  1. Un navigateur WEB.
  2. Informations sur une page HTML
  3. Un petit éditeur RTF

Application de démonstration.

La classe JEditorPane permet d'éditer des contenus de natures différentes. Ce composant utilise une implémentation de EditorKit pour réaliser ceci. Par défaut trois types de contenu sont connus :

Pour charger du texte dans le JEditorPane, on peut utiliser une des méthodes suivantes :

0Un navigateur WEB avec JEditorPane

On peut créer un vavigateur WEB avec un JEditorPane en le faisant réagir aux clics sur le hyperliens. Le JEditorPane doit être non éditable.

javax.swing.event.HyperlinkListener monListeneur;
monListeneur = new javax.swing.event.HyperlinkListener() {
    public void hyperlinkUpdate(javax.swing.event.HyperlinkEvent e) {
       if (e.getEventType() ==  HyperlinkEvent.EventType.ACTIVATED) {
               JEditorPane pane = (JEditorPane)e.getSource();
               try {
                   pane.setPage(e.getURL());
               }catch (IOException ex) {
                   pane.setText("ERREUR : "+ex.getMessage());
               }
       }
    }
};

Puis, on ajoute le listeneur au JEditorPane :

jEditorPane.addHyperlinkListener(monListeneur);

1Informations sur une page HTML

Une page HTML est représentée dans un modèle de type HTMLDocument.

//Le titre de la page
(String)monDocHTML.getProperty(Document.TitleProperty);
//Les liens de la page
HTMLDocument.Iterator it = monDocHTML.getIterator(HTML.Tag.A);
while(it.isValid()){ 
   SimpleAttributeSet s = (SimpleAttributeSet)it.getAttributes(); 
   String lien = (String)s.getAttribute(HTML.Attribute.HREF); 
   int deb = it.getStartOffset(); 
   int fin = it.getEndOffset(); 
   String v = monDocHTML.getText(deb, fin-deb+1); 
   // v : le texte,  lien : le lien 
   it.next();
}
// les textes en gras 
it = monDocHTML.getIterator(HTML.Tag.B);
while(it.isValid()){ 
   int deb = it.getStartOffset();
   int fin = it.getEndOffset(); 
   String v = monDocHTML.getText(deb, fin-deb+1);
    
   it.next();
}
// les textes en italique 
it = monDocHTML.getIterator(HTML.Tag.I);
while(it.isValid()){
   int deb = it.getStartOffset();
   int fin = it.getEndOffset(); 
   String v = monDocHTML.getText(deb, fin-deb+1);
  
   it.next();
}
// les images
it = monDocHTML.getIterator(HTML.Tag.IMG);
while(it.isValid()){  
   RunElement s = (RunElement)it.getAttributes();
   String source = (String)s.getAttribute(HTML.Attribute.SRC);
   String alt    = (String)s.getAttribute(HTML.Attribute.ALT);
   //le fichier : source, et le texte alternatif : alt 
   it.next();
}

2Un petit éditeur RTF.

La classe suivante fournit un éditeur de texte RTF. quand l'utilisateur relacle le bouton droit de la souris, après une sélection de texte, une boîte de dialogue lui permet de configurer le texte sélectionné.

public class EditeurRTF extends JEditorPane  {

  private DefaultStyledDocument monDocRTF; 
  private RTFEditorKit rtf; 

  public EditeurRTF() {
        super();
        initialize(); 
  }

   private void initialize() {
        setContentType("text/rtf");
        rtf = (RTFEditorKit) EditeurRTF.this.getEditorKit();
        monDocRTF = (DefaultStyledDocument) getDocument();   
        // définition du style par défaut
        Style def = monDocRTF.getStyle("default");
        SimpleAttributeSet asd = new SimpleAttributeSet();
          StyleConstants.setFontFamily(asd, this.getFont().getFamily());
          StyleConstants.setFontSize(asd,  this.getFont().getSize());
          StyleConstants.setBackground(asd, this.getBackground());
          StyleConstants.setForeground(asd, this.getForeground());
          StyleConstants.setAlignment(asd, 0);
        def.addAttributes(asd);
        monDocRTF.setParagraphAttributes(0, 1, asd, true);

        this.addMouseListener(new java.awt.event.MouseAdapter() {   
           public void mouseReleased(java.awt.event.MouseEvent e) {  
           int d = EditeurRTF.this.getSelectionStart();
           int f = EditeurRTF.this.getSelectionEnd();
           if(d==f)return; // pas de texte sélectionné !

           DialogueRTF drtf = new DialogueRTF(null);
           drtf.setLocation(e.getXOnScreen(), e.getYOnScreen());

           Element el = rtf.getCharacterAttributeRun();
           AttributeSet as = el.getAttributes();
           int ta = ((Integer)as.getAttribute(StyleConstants.FontSize)).intValue();
           int alignement = ((Integer)as.getAttribute(StyleConstants.Alignment)).intValue();
           int x = Font.PLAIN;
           Object o = as.getAttribute(StyleConstants.Italic);
           if(o!=null && ((Boolean)o).booleanValue())x = Font.ITALIC;
           o = as.getAttribute(StyleConstants.Bold);
           if(o!=null && ((Boolean)o).booleanValue())x = x | Font.BOLD;

           Font fo = new Font((String)as.getAttribute(StyleConstants.FontFamily), x, ta);
           Color couleurTexte = (Color)as.getAttribute(StyleConstants.Foreground);
           Color couleurFond = (Color)as.getAttribute(StyleConstants.Background);
           if (couleurFond==null)couleurFond = EditeurRTF.this.getBackground();
           // dialogue de configuration du texte sélectionné
           drtf.set(fo, couleurTexte, couleurFond, alignement);
           drtf.setVisible(true);
           if(drtf.isOK()){
              String t = EditeurRTF.this.getSelectedText();
              SimpleAttributeSet as1 = new SimpleAttributeSet();
              StyleConstants.setFontFamily(as1, drtf.getFonte().getFamily());
              StyleConstants.setFontSize(as1,  drtf.getFonte().getSize());
              StyleConstants.setItalic(as1, drtf.getFonte().isItalic());
              StyleConstants.setBold(as1, drtf.getFonte().isBold());
              StyleConstants.setBackground(as1, drtf.getCouleurFond());
              StyleConstants.setForeground(as1, drtf.getCouleurTexte());
               
              SimpleAttributeSet asp = new SimpleAttributeSet();
              StyleConstants.setAlignment(asp, drtf.getAlignement());
              try {
                 monDocRTF.replace(d, f-d, t, as1);
                 if(alignement!= drtf.getAlignement())
                    monDocRTF.setParagraphAttributes(d, f-d, asp, false);
              } catch (BadLocationException e1) {
                     //...
              }
           }   
        } 
   }); 
  }
}

haut de la page