• category: swing folder: ToolTipLocation title: JToolTipの表示位置 tags: [JToolTip, JWindow, MouseListener, MouseMotionListener] author: aterai pubdate: 2010-05-03T22:32:22+09:00 description: JToolTipの表示位置がドラッグでマウスカーソルに追従するように設定します。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTVoUwnbfI/AAAAAAAAAn8/lAHqv08RJKA/s800/ToolTipLocation.png

概要

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

解説

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

参考リンク

コメント