我想创建一个带有标签的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 :(得分:2)
您需要覆盖getToolTipText(MouseEvent)
方法。
然后在代码中,您需要确定滑块中的鼠标位置以确定要显示的文本。我从来没有尝试过,但你可以使用BasicSliderUI
来做到这一点。它有方法valueForXPosition
和valueForYPosition
可能会有帮助。
答案 1 :(得分:1)
明显第一次尝试不起作用的根本原因是标签没有添加到滑块(可能它们应该,因为它们不是太多无论如何和地图是真实的地图JLabels),但只是在BasicSliderUI的paintHorizontal / VerticalLabel中即时渲染。 Rob的建议是自然的方法:计算任何标签是否在mousePosition下并返回其工具提示(如果可用)。
令人惊讶的是,没有公共API(在JSlider和ui委托上都没有)来实现标签边界的计算。您需要的是访问x / yPositionForValue - 但这是受保护的。所以只有肮脏的出路
希望被证明是错误的并且看到一个干净的实现(没有子类化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){}
}