Подсказка в ярлыках в JSlider - PullRequest
       3

Подсказка в ярлыках в JSlider

3 голосов
/ 09 сентября 2011

Я хочу создать 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 ]

2 голосов
/ 09 сентября 2011

Вам необходимо переопределить метод getToolTipText(MouseEvent).

Затем в коде вам нужно будет определить положение мыши в ползунке, чтобы определить текст для отображения.Я никогда не пробовал, но вы могли бы использовать BasicSliderUI для этого.У него есть методы valueForXPosition и valueForYPosition, которые могут помочь.

1 голос
/ 03 апреля 2013

Вот как я это сделал.Это немного грубо, но работает нормально.:)

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

}

}

1 голос
/ 10 сентября 2011

Основная причина, по которой очевидно, что первая попытка не сработала, заключается в том, что метки не добавляются в ползунок (как, вероятно, следует делать, учитывая, что их в любом случае не слишком много и карта - это карта реальных JLabels), но просто отображается на лету в PaintHorizontal / VerticalLabel из BasicSliderUI.Так что совет Роба - это естественный путь: вычислить, находится ли какая-либо из меток под mousePosition, и вернуть ее всплывающую подсказку, если она доступна.

Удивительно, но нет общедоступного API (ни в JSlider, ни в делегате пользовательского интерфейса) длядобиться расчета границ метки.Вам нужен доступ к x / yPositionForValue - но он защищен.Таким образом, есть только грязные выходы

  • доступ к x / yPositionForValue рефлексивно
  • c & p и реализация в подклассе JSlider: дает только приближения, так как многие из внутренних элементов пользовательского интерфейса защищены или дажеprivate

Хотелось бы доказать, что ошибался и увидел бы чистую реализацию (без подклассов ui-делегатов :-)

0 голосов
/ 23 сентября 2014

Это отлично работает. Вот ссылка на источник

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