概要

JToolTipの表示位置がドラッグでマウスカーソルに追従するように設定します。

サンプルコード

private void updateTipText(MouseEvent e) {
  Point pt = e.getPoint();
  String txt = String.format("Window(x, y)=(%d, %d)", pt.x, pt.y);
  tip.setTipText(txt);
  Point p = getToolTipLocation(e);
  if (SwingUtilities.isLeftMouseButton(e)) {
    if (prev.length() != txt.length()) {
      window.pack();
    }
    window.setLocation(p);
    window.setAlwaysOnTop(true);
  } else {
    if (popup != null) {
      popup.hide();
    }
    popup = factory.getPopup(e.getComponent(), tip, p.x, p.y);
    Container c = tip.getTopLevelAncestor();
    if (c instanceof JWindow &&
        ((JWindow) c).getType() == Window.Type.POPUP) {
      System.out.println("Popup$HeavyWeightWindow");
    } else {
      popup.show();
    }
  }
  prev = txt;
}
View in GitHub: Java, Kotlin

解説

  • 左クリックしてドラッグ
    • JWindowJToolTipを追加してWindow#setLocation()メソッドで移動
    • テキスト文字数が変更された場合のみJWindow#pack()メソッドを呼び出してサイズを更新
  • 左クリック以外でドラッグ
    • PopupFactory#getPopup()Popupを取得して表示
    • Popupの位置が変更できずこれを再作成しているため、親フレームの外にJToolTipが表示される場合は非表示に設定
      • フレーム外ではHeavyWeightJWindowJToolTipが表示されるため、再作成すると表示がチラついてしまう

参考リンク

コメント