2013-07-29 65 views
2

我想創建一個JSlider只有四個可能的值:10(分鐘),30,60和100(最大)。是否有可能創建一個只能「捕捉」這些值?如果是這樣,你能舉個例子嗎?謝謝!可以在JSlider中捕捉特定值嗎?

+0

是否有你想要不一致增加滴答的原因? 10,40,70,100不符合您的需求? – JBuenoJr

+1

是的,你可以。你需要一個自定義的'DefaultBoundedRangeModel'來管理這些值和'BasicSliderUI'的一個實現來管理步進......在那裏我停止了嘗試...... – MadProgrammer

回答

4

下面的例子可能是最簡單的方法來做你想找的。請注意,您不能簡單地重寫JSlider子類上的getValue()以返回特定於域的值,因爲這對於基礎JSlider/BasicSliderUI實現有問題。在這個例子中,我定義了一個自定義的getDomainValue()來根據滑塊滴答位置返回特定於域的值(10,30,60或100)。

package example.stackoverflow; 

import java.util.Hashtable; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class SteppingSliderExample 
{ 
    public static class SteppingSlider extends JSlider 
    { 
     private static final long serialVersionUID = -1195270044097152629L; 
     private static final Integer[] VALUES = { 10, 30, 60, 100 }; 
     private static final Hashtable<Integer, JLabel> LABELS = new Hashtable<>(); 
     static 
     { 
      for(int i = 0; i < VALUES.length; ++i) 
      { 
       LABELS.put(i, new JLabel(VALUES[i].toString())); 
      } 
     } 

     public SteppingSlider() 
     { 
      super(0, VALUES.length - 1, 0); 
      setLabelTable(LABELS);  
      setPaintTicks(true); 
      setPaintLabels(true); 
      setSnapToTicks(true); 
      setMajorTickSpacing(1); 
     } 

     public int getDomainValue() 
     { 
      return VALUES[getValue()]; 
     } 
    } 

    public static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SteppingSlider"); 
     frame.setSize(500, 120); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final SteppingSlider steppingSlider = new SteppingSlider(); 
     final String labelPrefix = "Slider value: "; 
     final JLabel output = new JLabel(labelPrefix + steppingSlider.getDomainValue()); 
     steppingSlider.addChangeListener(new ChangeListener() 
     {   
      @Override 
      public void stateChanged(ChangeEvent evt) 
      { 
       output.setText(labelPrefix + steppingSlider.getDomainValue()); 
      } 
     }); 
     frame.getContentPane().setLayout(
       new BoxLayout(frame.getContentPane(), 
         BoxLayout.Y_AXIS));  
     frame.getContentPane().add(steppingSlider); 
     frame.getContentPane().add(output); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

你的例子正是我一直在尋找的!感謝您向我展示如何做到這一點。 :) –

-1

編寫一個覆蓋getValue()的JSlider的子類, [1,2,3,4](原始)到[10,30,60,100]。我想到的最簡單的解決方案。

+0

這是非常危險的,因爲這會改變' JSlider'(它在內部也可以訪問它的'getValue()'方法)。 – brimborium