2009-03-11 7 views

Répondre

3

Je compris ce que je voulais faire en utilisant des documents stylés et peu d'aide de la HTMLEditorKit:

public class HighlightHyperlinkExample { 
    private static Element lastHyperlinkElementEntered; 
    private static JEditorPane textPane; 


    public static void main(String[] args) { 
     textPane = new JEditorPane(); 
     textPane.setContentType(new HTMLEditorKit().getContentType()); 
     JScrollPane scrollPane = new JScrollPane(textPane); 
     textPane.setText(
       "Sample text with <a href=\"x\">a link</a> and another <a href=\"x\">link</a>."); 

     initListeners(); 

     JFrame frame = new JFrame(); 
     frame.add(scrollPane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 


    private static void initListeners() { 
     textPane.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseExited(MouseEvent e) { 
       removeHyperlinkHighlight(); 
      } 
     }); 
     textPane.addMouseMotionListener(new MouseMotionListener() { 
      public void mouseDragged(MouseEvent e) { 
      } 

      public void mouseMoved(MouseEvent e) { 
       Point pt = new Point(e.getX(), e.getY()); 
       int pos = textPane.viewToModel(pt); 
       if (pos >= 0) { 
        HTMLDocument hdoc = (HTMLDocument) textPane.getDocument(); 
        Element elem = hdoc.getCharacterElement(pos); 
        if (elem != null) { 
         AttributeSet a = elem.getAttributes(); 
         AttributeSet anchor = (AttributeSet) a.getAttribute(HTML.Tag.A); 
         if (anchor != null) { 
          //only highlight anchor tags 
          highlightHyperlink(elem); 
         } else { 
          removeHyperlinkHighlight(); 
         } 
        } 
       } 
      } 
     }); 
    } 

    private static void removeHyperlinkHighlight() { 
     changeColor(lastHyperlinkElementEntered, Color.BLUE); 
     lastHyperlinkElementEntered = null; 
    } 

    private static void highlightHyperlink(Element hyperlinkElement) { 
     if (hyperlinkElement != lastHyperlinkElementEntered) { 
      lastHyperlinkElementEntered = hyperlinkElement; 
      changeColor(hyperlinkElement, Color.RED); 
     } 
    } 

    private static void changeColor(Element el, Color color) { 
     if (lastHyperlinkElementEntered != null) { 
      HTMLDocument doc = (HTMLDocument) textPane.getDocument(); 
      int start = el.getStartOffset(); 
      int end = el.getEndOffset(); 
      StyleContext ss = doc.getStyleSheet(); 
      Style style = ss.addStyle("HighlightedHyperlink", null); 
      style.addAttribute(StyleConstants.Foreground, color); 
      doc.setCharacterAttributes(start, end - start, style, false); 
     } 
    } 
} 
+0

Envisagez de colorer la couleur réelle qui a été écrasée dans #highlightHyperlink et utilisez la couleur mémorisée dans #removeHyperlinkHighlight. – ordnungswidrig

+0

Ce serait mieux pour cet exemple. –

2

Voir Highlighting Words in a JTextComponent.

JTextArea textComp = new JTextArea(); 

// Highlight the occurrences of the word "public" 
highlight(textComp, "public"); 

// Creates highlights around all occurrences of pattern in textComp 
public void highlight(JTextComponent textComp, String pattern) { 
    // First remove all old highlights 
    removeHighlights(textComp); 

    try { 
     Highlighter hilite = textComp.getHighlighter(); 
     Document doc = textComp.getDocument(); 
     String text = doc.getText(0, doc.getLength()); 
     int pos = 0; 

     // Search for pattern 
     while ((pos = text.indexOf(pattern, pos)) >= 0) { 
      // Create highlighter using private painter and apply around pattern 
      hilite.addHighlight(pos, pos+pattern.length(), myHighlightPainter); 
      pos += pattern.length(); 
     } 
    } catch (BadLocationException e) { 
    } 
} 

// Removes only our private highlights 
public void removeHighlights(JTextComponent textComp) { 
    Highlighter hilite = textComp.getHighlighter(); 
    Highlighter.Highlight[] hilites = hilite.getHighlights(); 

    for (int i=0; i<hilites.length; i++) { 
     if (hilites[i].getPainter() instanceof MyHighlightPainter) { 
      hilite.removeHighlight(hilites[i]); 
     } 
    } 
} 

// An instance of the private subclass of the default highlight painter 
Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red); 

// A private subclass of the default highlight painter 
class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter { 
    public MyHighlightPainter(Color color) { 
     super(color); 
    } 
} 
+0

Merci. J'ai complètement oublié les surligneurs. Malheureusement, ce que je voulais faire était de changer le premier plan, pas le fond, ce qui est beaucoup plus difficile avec les surligneurs. Il m'a envoyé sur le bon chemin, cependant. Donc merci. –

+0

Je voulais juste dire que lorsque j'ouvre votre lien [Mettre en évidence les mots dans un composant JText], il renvoie vers une page contenant un virus. – Tdorno

Questions connexes