3

我想创建一个带有标签的 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

4 回答 4

2

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

然后在代码中,您需要确定滑块中的鼠标位置以确定要显示的文本。我从未尝试过,但您也许可以使用BasicSliderUI它。它有方法valueForXPositionvalueForYPosition可能会有所帮助。

于 2011-09-09T15:32:59.943 回答
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) {
    }

}

}

于 2013-04-03T10:27:58.117 回答
1

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

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

  • 反射地访问 x/yPositionForValue
  • c&p 并在 JSlider 子类中实现:仅给出近似值,因为许多 ui 内部是受保护的,甚至是私有的

希望被证明是错误的并看到一个干净的实现(不继承 ui-delegates :-)

于 2011-09-10T11:02:27.997 回答
0

这工作正常。这是源链接

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){}
}
于 2014-09-22T23:32:28.163 回答