• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSliderのノブをドラッグ中にToolTipで値を表示
#navi(../)
#tags(JSlider, JWindow, JToolTip)
RIGHT:Posted by &author(aterai); at 2012-12-17
*JSliderのノブをドラッグ中にToolTipで値を表示 [#v7c49d3e]
``JSlider``のノブをドラッグ中に``ToolTip``でその現在値を表示します。
---
title: JSliderのノブをドラッグ中にToolTipで値を表示
tags: [JSlider, JWindow, JToolTip]
author: aterai
pubdate: 2012-12-17T00:06:15+09:00
description: JSliderのノブをドラッグ中にToolTipでその現在値を表示します。
---
* 概要 [#v7c49d3e]
`JSlider`のノブをドラッグ中に`ToolTip`でその現在値を表示します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/-RBRHhAqSA3A/UM3gOvnmIOI/AAAAAAAABZM/LdLir_Y4dQc/s800/SliderToolTips.png)

//#screenshot
#ref(https://lh6.googleusercontent.com/-RBRHhAqSA3A/UM3gOvnmIOI/AAAAAAAABZM/LdLir_Y4dQc/s800/SliderToolTips.png)

**サンプルコード [#d5baebf6]
* サンプルコード [#d5baebf6]
#code(link){{
class SliderPopupListener extends MouseAdapter{
  private final JWindow toolTip = new JWindow();
  private final JLabel label = new JLabel("", SwingConstants.CENTER);
  private final Dimension size = new Dimension(30, 20);
  public SliderPopupListener() {
    label.setOpaque(false);
    label.setBackground(UIManager.getColor("ToolTip.background"));
    label.setBorder(UIManager.getBorder("ToolTip.border"));
    toolTip.add(label);
    toolTip.setSize(size);
  }
  private int prevValue = -1;
  protected void updateToolTip(MouseEvent me) {
    JSlider slider = (JSlider)me.getSource();
    int intValue = (int)slider.getValue();
    if(prevValue!=intValue) {
      label.setText(String.format("%03d", slider.getValue()));
      Point pt = me.getPoint();
      pt.y = -size.height;
      SwingUtilities.convertPointToScreen(pt, (Component)me.getSource());
      pt.translate(-size.width/2, 0);
      toolTip.setLocation(pt);
    }
    prevValue = intValue;
  }
  @Override public void mouseDragged(MouseEvent me) {
    updateToolTip(me);
  }
  @Override public void mousePressed(MouseEvent me) {
    toolTip.setVisible(true);
    updateToolTip(me);
  }
  @Override public void mouseReleased(MouseEvent me) {
    toolTip.setVisible(false);
  }
}
}}

**解説 [#d1ef2e47]
上記のサンプルでは、ドラッグ中だけ``ToolTip``で値を表示したいので、``JToolTip``ではなくその背景色などが同じになるように設定した``JWindow``を使用しています。
* 解説 [#d1ef2e47]
上記のサンプルでは、ドラッグ中だけ`ToolTip`で値を表示したいので、`JToolTip`ではなくその背景色などが同じになるように設定した`JWindow`を使用しています。

- ``MouseListener``
-- ``JWindow``の表示非表示の切り替え
- ``MouseMotionListener``
-- ``JSlider``が指す値と``JWindow``の位置(中心がマウスカーソルのx座標、``JWindow``の下端が``JSlider``の上端)の更新
- `MouseListener`
-- `JWindow`の表示非表示の切り替え
- `MouseMotionListener`
-- `JSlider`が指す値と`JWindow`の位置(中心がマウスカーソルの`x`座標、`JWindow`の下端が`JSlider`の上端)の更新

----
- デフォルトの``JSlider``では、ノブ以外の位置をクリックすると段階的に位置が変化するため、上記の``MouseListener``を使用するとマウスカーソルの位置とノブの表示位置がずれる
- デフォルトの`JSlider`では、ノブ以外の位置をクリックすると段階的に位置が変化するため、上記の`MouseListener`を使用するとマウスカーソルの位置とノブの表示位置がずれる
- [[JSliderでクリックした位置にノブをスライド>Swing/JumpToClickedPositionSlider]]を使用して、クリック直後にその位置にノブ移動するように設定
- ``JSlider.VERTICAL``には未対応
- `JSlider.VERTICAL`には未対応

**参考リンク [#bd488b1d]
* 参考リンク [#bd488b1d]
- [[JSliderでクリックした位置にノブをスライド>Swing/JumpToClickedPositionSlider]]
- [[JToolTipの表示位置>Swing/ToolTipLocation]]

**コメント [#ze6cb470]
* コメント [#ze6cb470]
#comment
#comment