【问题标题】:Tooltip in labels in JSliderJSlider标签中的工具提示
【发布时间】:2011-09-09 15:11:41
【问题描述】:

我想创建一个带有标签的 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,并且它“覆盖”了所有其他工具。

有什么方法可以解决我的问题吗?

【问题讨论】:

  • 必须有另一个...,为了更快更好的帮助,请(编辑您的线程)在此处发布简短且可运行的代码,如sscce.org所述

标签: java swing tooltip jslider


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这意味着我将无法使用JButton 作为标签来获得方便的快捷方式来设置滑块值。太糟糕了...
    【解决方案3】:

    这就是我的做法。它有点粗糙,但效果很好。 :)

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

    }

    【讨论】:

      【解决方案4】:

      这很好用。这是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){}
      }
      

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 2011-04-09
        • 2014-08-22
        • 2011-01-13
        • 2018-12-20
        • 2011-09-30
        • 1970-01-01
        • 2012-08-22
        相关资源
        最近更新 更多