2009-03-11 1 views
2

私は基本的にそれらの上にマウスを置いたときにリンクの色を変更する実装をしたい。リンク上にマウスを置くとトリガーされるHyperlinkEventが、HTML要素を手渡しますが、スタイル属性を設定することはできません。設定可能な属性を持つ要素を取得する方法はわかりません。JEditorPane内のHTMLDocumentの特定の要素の色を変更するにはどうすればよいですか?

答えて

3

は、私はスタイルの文書とのHTMLEditorKitからの助けのビットを使ってやりたいことを考え出しました。私はハイライターを完全に忘れていた。残念ながら私がやりたかったのは、背景ではなく前景を変えることでした。これはハイライトライターにとってははるかに難しいことです。しかし、それは正しい道に私を送りました。ほんとありがと。
+0

#highlightHyperlinkで上書きされた実際の色を修復し、#removeHyperlinkHighlightで思い出した色を使用することを検討してください。 – ordnungswidrig

+0

これはこの例の方が良いでしょう。 –

2

Highlighting Words in a JTextComponentを参照してください。

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

ありがとう:

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

あなたのリンク[JTextComponentの強調表示]を開くと、ウイルスに感染したページにリンクしているとします。 – Tdorno