2014-11-02 5 views
1

Я хочу добавить всплывающие подсказки к гиперссылкам в (нередактируемом) JEditorPane. Я нашел некоторые подсказки в Интернете, но никто из них не работал для меня. Это мой текущий подход:Получить атрибут title гиперссылки в JEditorPane при наведении указателя мыши

jEditorPaneIsFollower.addMouseMotionListener(new java.awt.event.MouseMotionListener() { 
    @Override 
    public void mouseMoved(java.awt.event.MouseEvent evt) { 
     int pos = jEditorPaneIsFollower.viewToModel(evt.getPoint()); 
     if (pos >= 0) { 
      HTMLDocument hdoc = (HTMLDocument)jEditorPaneIsFollower.getDocument(); 
      javax.swing.text.Element e = hdoc.getCharacterElement(pos); 
      AttributeSet a = e.getAttributes(); 
      String href = (String) a.getAttribute(javax.swing.text.html.HTML.Attribute.TITLE); 
      if (href != null) { 
       jEditorPaneIsFollower.setToolTipText(href); 
      } else { 
       jEditorPaneIsFollower.setToolTipText(null); 
      } 
     } 
     else { 
      jEditorPaneIsFollower.setToolTipText(null); 
     } 
    } 
    @Override 
    public void mouseDragged(java.awt.event.MouseEvent e) { 
     // 
    } 
}); 

Инициализация моего редактора панели:

jEditorPaneIsFollower.setEditable(false); 
jEditorPaneIsFollower.setContentType("text/html"); 
jEditorPaneIsFollower.setDocument(new HTMLDocument()); 
jEditorPaneIsFollower.setEditorKit(new HTMLEditorKit()); 

Содержание панели редактора заключается в следующем:

<html> 
    <head> 
    </head> 
    <body> 
    <table> 
     <tr> 
     <td width="1%" valign="top"> 
      &#220;bergeordnet: 
     </td> 
     <td valign="top"> 
      <a href="#cr_288" alt="DRGs als Prozesssteuerung" title="DRGs als Prozesssteuerung">288</a> 
     </td> 
     </tr> 
    </table> 
    </body> 
</html> 

От отладки, я вижу, что pos всегда меняется, когда я перемещаю мышь над областью редактора, однако элемент символов e всегда null.

Так что мои вопросы:

  1. Мне нужно установить комплект редактор и тип документа в HTML при инициализации панели редактора ли?
  2. Как я могу получить правильный элемент и получить доступ к атрибуту title, чтобы установить его как подсказку при перемещении мыши над панелью редактора?

ответ

4

Вы, кажется, иметь дело с неправильными элементами, HTML.Attribute.TITLE не является ни якорный тег или свойство тега привязки ...

Вместо , вам необходимо извлечь атрибут HTML.Tag.A из документа Element, тогда вам необходимо извлечь из него HTML.Attribute.HREF ...

Вместо использования MouseListener, вы можете переопределить такие компоненты, getToolTipText метод, который вызывается с помощью ToolTipManager и позволит вам настроить возвращаемое значение, например ...

JEditorPane editorPane = new JEditorPane() { 

    @Override 
    public String getToolTipText(MouseEvent evt) { 
     String text = null; 
     int pos = viewToModel(evt.getPoint()); 
     if (pos >= 0) { 
      HTMLDocument hdoc = (HTMLDocument) getDocument(); 
      javax.swing.text.Element e = hdoc.getCharacterElement(pos); 
      AttributeSet a = e.getAttributes(); 

      SimpleAttributeSet value = (SimpleAttributeSet) a.getAttribute(HTML.Tag.A); 
      if (value != null) { 
       String href = (String) value.getAttribute(HTML.Attribute.HREF); 
       if (href != null) { 
        text = href; 
       } 
      } 
     } 
     return text; 
    } 

}; 

Использование этого потребуется вам вручную зарегистрировать компонент с ToolTipManager как setToolTipText делает это нормально ...

ToolTipManager.sharedInstance().registerComponent(editorPane); 

NB: Если вы хотите, чтобы отобразить значение alt, вы должны использовать HTML.Attribute.TITLE вместо HTML.Attribute.HREF

+0

Большое спасибо, отлично работает! – Daniel

+0

Рад, что это помогло ... – MadProgrammer

2

Может быть, вы можете использовать HyperlinkListener:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.text.*; 
import javax.swing.text.html.*; 

public final class HyperlinkTooltipTest { 
    private static final String HTML_TEXT = "<html><body>" 
    + "<table><tr>" 
    + "<td width=\"1%\" valign=\"top\">" 
    + "&#220;bergeordnet:" 
    + "</td>" 
    + "<td valign=\"top\">" 
    + "<a href=\"#cr_288\" alt=\"DRGs als Prozesssteuerung\" title=\"DRGs als Prozesssteuerung\">288</a>" 
    + "</td></tr></table>" 
    + "</body></html>"; 

    private JComponent makeUI() { 
    JEditorPane jEditorPaneIsFollower = new JEditorPane(); 
    jEditorPaneIsFollower.setEditable(false); 
    jEditorPaneIsFollower.setContentType("text/html"); 
    jEditorPaneIsFollower.setDocument(new HTMLDocument()); 
    jEditorPaneIsFollower.setEditorKit(new HTMLEditorKit()); 
    jEditorPaneIsFollower.setText(HTML_TEXT); 
    ToolTipManager.sharedInstance().registerComponent(jEditorPaneIsFollower); 

    jEditorPaneIsFollower.addHyperlinkListener(new HyperlinkListener() { 
     private String tooltip; 
     @Override public void hyperlinkUpdate(HyperlinkEvent e) { 
     JEditorPane editor = (JEditorPane) e.getSource(); 
     if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { 
      System.out.println(e); 
     } else if (e.getEventType() == HyperlinkEvent.EventType.ENTERED) { 
      tooltip = editor.getToolTipText(); 
      Element elem = e.getSourceElement(); 
      if (elem != null) { 
      AttributeSet attr = elem.getAttributes(); 
      AttributeSet a = (AttributeSet) attr.getAttribute(HTML.Tag.A); 
      if (a != null) { 
       editor.setToolTipText((String) a.getAttribute(HTML.Attribute.TITLE)); 
      } 
      } 
     } else if (e.getEventType() == HyperlinkEvent.EventType.EXITED) { 
      editor.setToolTipText(tooltip); 
     } 
     } 
    }); 
    return new JScrollPane(jEditorPaneIsFollower); 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new HyperlinkTooltipTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
+0

Это отлично работает, как хорошо. Оба решения принимаются. – Daniel

0

CustomEditorPane:

@Override 
public String getToolTipText(MouseEvent _event) { 
    int pos_ = viewToModel(_event.getPoint()); 
    if (pos_ < 0) { 
     //If not found, then return null 
     return null; 
    } 
    HTMLDocument hdoc_ = (HTMLDocument) getDocument(); 
    Element e_ = hdoc_.getCharacterElement(pos_); 
    AttributeSet a_ = e_.getAttributes(); 

    Enumeration<?> enumm_ = a_.getAttributeNames(); 
    while (enumm_.hasMoreElements()) { 
     Object o_ = enumm_.nextElement(); 
     if (!o_.toString().equalsIgnoreCase("a")) { 
      //skip html tags that are not anchors 
      continue; 
     } 
     Object value_ = a_.getAttribute(o_); 
     //Test if the anchor has an attribute "title" 
     if (!(value_ instanceof SimpleAttributeSet)) { 
      continue; 
     } 
     SimpleAttributeSet attSet_ = (SimpleAttributeSet)value_; 
     Enumeration<?> at_ = attSet_.getAttributeNames(); 
     while (at_.hasMoreElements()) { 
      Object att_ = at_.nextElement(); 
      if (att_.toString().equalsIgnoreCase("title")) { 
       //return the value of the title of the anchor 
       return attSet_.getAttribute(att_).toString(); 
      } 
      //skip other attributes of this anchor 
     } 
    } 
    //The visited tag is not an anchor or the visited anchor has no attribute named title 
    return null; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^