概要

JEditorPanedivspanタグのtitle属性をToolTipで表示できるように設定します。

サンプルコード

JTextPane editor1 = new JTextPane() {
  private transient Position.Bias[] bias = new Position.Bias[1];
  @Override public String getToolTipText(MouseEvent e) {
    String title = super.getToolTipText(e);
    JEditorPane editor = (JEditorPane) e.getSource();
    if (!editor.isEditable()) {
      Point pt = new Point(e.getX(), e.getY());
      int pos = editor.getUI().viewToModel(editor, pt, bias);
      if (bias[0] == Position.Bias.Backward && pos > 0) {
        pos--;
      }
      if (pos >= 0 &&(editor.getDocument() instanceof HTMLDocument)) {
        HTMLDocument hdoc = (HTMLDocument) editor.getDocument();
        Element elem = hdoc.getCharacterElement(pos);
        if (elem != null) {
          AttributeSet a = elem.getAttributes();
          AttributeSet span = (AttributeSet) a.getAttribute(HTML.Tag.SPAN);
          if (span != null) {
            title = (String) span.getAttribute(HTML.Attribute.TITLE);
          }
        }
      }
    }
    return title;
  }
};
editor1.setEditorKit(new HTMLEditorKit());
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JEditorPaneHTMLEditorKitを使った場合のToolTip表示についてテストしています。imgタグのalt属性は自動的にToolTip表示され、リンクはHyperlinkListenerを追加することでToolTipを変更できます。

private final String htmlText =
  "<html><body>" +
  "<span style='background:#88ff88;' title='tooltip: span[@title]'>span</span><br />" +
  "<div title='tooltip: div[@title]'>div tag: div div div div</div>" +
  "<div style='padding: 2 24;'><img src='"+ image +"' alt='16x16 favicon' />&nbsp;" +
  "<a href='https://ateraimemo.com/'>Java Swing Tips</a></div>" +
  "</body></html>";
  • 上: spanタグのtitle属性をToolTipで表示
    • HTMLEditorKitLinkControllerクラスを参考にJEditorPane#getToolTipText(MouseEvent)メソッドをオーバーライド
  • 下: divタグのtitle属性をToolTipで表示
    • ImageView#getToolTipText(...)を参考
    • HyperlinkListenerを追加
      class TooltipEditorKit extends HTMLEditorKit {
        @Override public ViewFactory getViewFactory() {
          return new HTMLFactory() {
            @Override public View create(Element elem) {
              AttributeSet attrs = elem.getAttributes();
              Object elementName = attrs.getAttribute(
                  AbstractDocument.ElementNameAttribute);
              Object o = (elementName != null)
                ? null : attrs.getAttribute(StyleConstants.NameAttribute);
              if (o instanceof HTML.Tag) {
                HTML.Tag kind = (HTML.Tag) o;
                if (kind == HTML.Tag.DIV) {
                  return new BlockView(elem, View.Y_AXIS) {
                    @Override public String getToolTipText(
                        float x, float y, Shape allocation) {
                      String s = super.getToolTipText(x, y, allocation);
                      if (s == null) {
                        s = (String) getElement().getAttributes().getAttribute(
                            HTML.Attribute.TITLE);
                      }
                      return s;
                    }
                  };
                }
              }
              return super.create(elem);
            }
          };
        }
      }
      

参考リンク

コメント