2011-09-09 60 views
3

我想創建一個帶有標籤的JSlider,它有一個工具提示。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

必須有另一種......,爲更快,更好的幫助,請(你線程編輯)描述http://sscce.org/ – mKorbel

回答

2

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

然後在代碼中,您需要確定滑塊中的鼠標位置以確定要顯示的文本。我從來沒有嘗試過,但你可能可以使用BasicSliderUI這個。它有方法valueForXPositionvalueForYPosition這可能有幫助。

1

根本原因的明顯先試不靈的是,標籤不添加到滑塊(如可能,他們應該,因爲他們沒有太多反正地圖是地圖一個真正的JLabel),而只是在BasicSliderUI的paintHorizo​​ntal/VerticalLabel中實時渲染。所以Rob的建議是一種自然的方法:計算是否有任何標籤位於mousePosition之下並返回它的工具提示(如果可用)。令人驚訝的是,沒有公開API(既沒有在JSlider上也沒有在UI代表上)來實現標籤邊界的計算。你需要訪問x/yPositionForValue - 但這是受保護的。因此,有隻髒出路

  • 訪問X/yPositionForValue反思
  • Ç& p和一個JSlider的子類中實現:只給出了,因爲許多UI內部的保護或近似甚至私人

很想被證明是錯誤,看到一個乾淨的實現(沒有子與UI代表:-)

+0

使張貼在這裏短,運行的代碼手段我將無法使用'JButton'作爲標籤來獲取便捷的快捷鍵來設置滑塊值。太糟糕了... – Matthieu

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

} 

}

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){} 
} 
相關問題