2011-09-09 9 views
3

ツールチップを持つラベルを持つJSliderを作成したいとします。JSliderのラベルのツールチップ

JSlider slider = new JSlider(); 
JLabel label = new JLabel("First"); 

slider.setPaintLabels(true); 
Hashtable<Integer, JLabel> labels = new Hashtable<Integer, JLabel>(); 

label.setToolTipText("Tooltip"); 

labels.put(new Integer(0), label); 
slider.setLabelTable(labels); 

ただし、このコードは機能しません。 JSliderにツールチップを追加することができ、それが他のすべてをカバーしているからだと思います。

私の問題を解決する方法はありますか?

+0

説明したように、ここでのショートや実行可能なコードを投稿する別の...、早くより良い助けをしてください(あなたがスレッドエディット)がなければならないhttp://sscce.org/ – mKorbel

答えて

2

getToolTipText(MouseEvent)メソッドをオーバーライドする必要があります。

次にコード内で、表示するテキストを決定するためにスライダーのマウスの位置を決定する必要があります。試したことはありませんが、BasicSliderUIを使用することができます。それには役に立つかもしれない方法valueForXPositionvalueForYPositionがあります。明らかに最初のラベルはスライダーに追加されていないということです(おそらく彼らは、与えられた彼らはとにかく多すぎるものではなく、マップが本当のJLabelのマップである必要がありますように)単に動作していないを試しため

1

根本的な理由BasicSliderUIのpaintHorizo​​ntal/VerticalLabelでオンザフライでレンダリングされます。ロブのアドバイスは自然な方法です:ラベルのどれかがmousePositionの下にあるかどうかを計算し、利用可能であればツールチップを返します。

驚くべきことに、ラベル境界の計算を達成するためにパブリックAPI(JSliderやUIデリゲートのいずれにもない)はありません。必要なのはx/yPositionForValueへのアクセスですが、それは保護されています。だから、

  • アクセスX/yPositionForValueは反射的
  • C & pとJSliderのサブクラスで実装して唯一の汚い方法がありますのみ、UIの内部の多くが保護されている近似あるいは民間与える

ここ

+0

です私はラベルとして 'JButton'を使用して、スライダの値を設定する便利なショートカットを得ることができません。残念な... – Matthieu

1

:-) UI-デリゲートをサブクラス化せずに、私はそれをやった方法です(間違って証明することを愛し、きれいな実装を参照してくださいだろう。それは少し粗いですが、それは正常に動作します。 :)

import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 
    import java.awt.event.MouseMotionListener; 
    import javax.swing.JMenuItem; 
    import javax.swing.JPopupMenu; 
    import javax.swing.JSlider; 
    import javax.swing.event.ChangeEvent; 
    import javax.swing.event.ChangeListener; 

    /** 
    * 
    * @author VirtejF 
    */ 
    public class MYJslider extends JSlider{ 

MYJslider ref=this; 
JPopupMenu info=new JPopupMenu(); 
JMenuItem value=new JMenuItem(); 
int Ypos=0; 

public MYJslider() 
{ 
    super(); 
    //this.addMouseListener(new Handlerclass()); 
    this.addChangeListener(new ChangeListener() { 
    @Override 
    public void stateChanged(ChangeEvent ce) { 
     JSlider slider = (JSlider)ce.getSource(); 
      slider.setToolTipText(slider.getValue()+""); 
      value.setText(slider.getValue()+""); 
    } 
}); 
    this.addMouseListener(new Handlerclass()); 
    this.addMouseMotionListener(new mouseMotion()); 
    info.add(value); 


} 

public class Handlerclass implements MouseListener{ 

    @Override 
    public void mousePressed(MouseEvent e) { 
     info.setVisible(true); 
     Ypos=e.getY()+20; 
     info.show(e.getComponent(), e.getX()+15, Ypos); 
     } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     info.setVisible(false); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

} 

public class mouseMotion implements MouseMotionListener 
{ 

    @Override 
    public void mouseDragged(MouseEvent e) { 
     //if(e.getX() > ref.getX() && e.getX() < ref.getX()+ref.getWidth()) 
     info.show(e.getComponent(), e.getX()+15, Ypos); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
    } 

} 

}

0

これが正常に動作します。手段そのので、ここでsource link

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.plaf.basic.BasicSliderUI; 

class JSliderEX extends JFrame 
{ 
    JSlider slider = new JSlider(0,100,0); 
    public JSliderEX() 
    { 
    super("JSliderEX"); 
    setSize(300,80); 
    setLocation(400,200); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    MySliderUI ms = new MySliderUI(slider,this); 
    slider.setUI(ms); 
    slider.setMajorTickSpacing(10); 
    slider.setMinorTickSpacing(5); 
    slider.setPaintTicks(true); 
    slider.setPaintLabels(true); 
    getContentPane().add(slider); 
    } 
    public static void main(String args[]){new JSliderEX().setVisible(true);} 
} 
class MySliderUI extends BasicSliderUI implements MouseMotionListener, MouseListener 
{ 
    JPopupMenu pop = new JPopupMenu(); 
    JFrame parent; 
    JLabel lblPop = new JLabel("",SwingConstants.CENTER); 
    public MySliderUI(JSlider slider,JFrame p) 
    { 
    super(slider); 
    slider.addMouseMotionListener(this); 
    slider.addMouseListener(this); 
    parent = p; 
    JPanel jp = new JPanel(); 
    lblPop.setPreferredSize(new Dimension(30,12)); 
    jp.add(lblPop); 
    pop.add(jp); 
    } 
    public void setPop(MouseEvent me) 
    { 
    lblPop.setText(""+slider.getValue()); 
    pop.setLocation((int)(parent.getX()+slider.getX()+me.getX()-10), 
        (int)(parent.getY()+slider.getY())); 
    } 
    public void mouseDragged(MouseEvent me){setPop(me);} 
    public void mouseMoved(MouseEvent me){} 
    public void mousePressed(MouseEvent me){pop.setVisible(true);setPop(me);} 
    public void mouseClicked(MouseEvent me){} 
    public void mouseReleased(MouseEvent me){pop.setVisible(false);} 
    public void mouseEntered(MouseEvent me){} 
    public void mouseExited(MouseEvent me){} 
} 
関連する問題