2011-08-17 53 views
1

我有一個JSlider的0最小值及100最大值當JSlider的第一次啓動,則該值爲0JSlider的 - 擊可以點去朝那個方向

現在,當我點擊我的鼠標在50,甚至20或100,JSlider不會移動到我點擊的位置。它只是向右跳一點點。

我該如何做到這一點,以便我點擊任何東西時的價值?

+0

爲什麼要實現非標準行爲?潛在的混淆你的用戶..保持鼠標按下,拇指將最終到達鼠標 – kleopatra

回答

3

這是一個能夠滿足你需要的類的開始。

總的想法是檢測用戶點擊的位置並計算必要的值偏移以匹配新的滑塊位置。

// 'E' stands for enhanced 
public class EJSlider extends JSlider { 

    public EJSlider() { 
     super(); 
     addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      Point p = e.getPoint(); 
      double percent = p.x/((double) getWidth()); 
      int range = getMaximum() - getMinimum(); 
      double newVal = range * percent; 
      int result = (int)(getMinimum() + newVal); 
      setValue(result); 
     } 
     }); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new EJSlider()); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

只需運行該示例。滑塊將跳到您點擊鼠標的任何位置。這尚未經過徹底測試,但不適用於垂直滑塊。

這個類似的解決方案將簡單地將我的自定義MouseListener添加到任何JSlider你想要的功能。

(注意,我知道它還不完美,但它是一個很好的開始。)

+0

我會期望你會重寫JSlider中的一些方法。目前還不清楚爲什麼你的方法在JSlider中移動旋鈕之後調用。 – toto2

+0

@ toto2,我的方法被調用爲鼠標點擊操作的一部分。標準'JSlider'通過將滑塊前進一個位置來處理咔嗒聲。我的動作會將滑塊移動到用戶點擊的值。這些事情發生的順序並不重要。 – jjnguy

+0

我的意思是標準的JSlider移動也必須從鼠標點擊的事件處理程序中調用。如果您的方法先被調用,然後再調用其他方法,那麼順序會是錯誤的;滑塊最終會出現在錯誤的地方。 – toto2