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。それには方法がvalueForXPositionあり、valueForYPositionそれが役立つかもしれません。

于 2011-09-09T15:32:59.943 に答える
1

明らかに最初の試みが機能しない根本的な理由は、ラベルがスライダーに追加されていないことです(とにかく数が多すぎず、マップが実際のJLabelのマップである場合は、おそらくそうする必要があります)が、単にオンザフライでレンダリングされます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 に答える
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 に答える
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 に答える