JSlider中的标签中的工具提示

时间:2011-09-09 15:11:41

标签: java swing tooltip 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添加工具提示,并且“覆盖”所有其他工具。

有没有方法,我如何解决我的问题?

4 个答案:

答案 0 :(得分:2)

您需要覆盖getToolTipText(MouseEvent)方法。

然后在代码中,您需要确定滑块中的鼠标位置以确定要显示的文本。我从来没有尝试过,但你可以使用BasicSliderUI来做到这一点。它有方法valueForXPositionvalueForYPosition可能会有帮助。

答案 1 :(得分:1)

明显第一次尝试不起作用的根本原因是标签没有添加到滑块(可能它们应该,因为它们不是太多无论如何地图是真实的地图JLabels),但只是在BasicSliderUI的paintHorizo​​ntal / VerticalLabel中即时渲染。 Rob的建议是自然的方法:计算任何标签是否在mousePosition下并返回其工具提示(如果可用)。

令人惊讶的是,没有公共API(在JSlider和ui委托上都没有)来实现标签边界的计算。您需要的是访问x / yPositionForValue - 但这是受保护的。所以只有肮脏的出路

  • 反复访问x / yPositionForValue
  • c&amp; p并在JSlider子类中实现:仅提供近似值,因为许多ui内部都受到保护甚至是私有的

希望被证明是错误的并且看到一个干净的实现(没有子类化ui-delegates :-)

答案 2 :(得分:1)

我是这样做的。它有点粗糙,但它工作正常。 :)

    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) {
    }

}

}

答案 3 :(得分: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){}
}