2013-07-29 4 views
2

10 (최소), 30, 60 및 100 (최대)의 4 가지 값만 사용하여 JSlider를 만들고 싶습니다. 이 값에만 "스냅"할 수있는 것을 만들 수 있습니까? 그렇다면 예제를 제공해 주시겠습니까? 감사!JSlider의 특정 값에 스냅 할 수 있습니까?

+0

틱이 일정하지 않게 변경하려는 이유가 있습니까? 10,40,70,100이 (가) 귀하의 필요를 충족시키지 못합니까? – JBuenoJr

+1

가능합니다. 당신은 스테핑을 관리하기 위해'BasicSliderUI'의 값과 구현을 관리하기 위해 커스텀'DefaultBoundedRangeModel'을 필요로 할 것입니다 ... 그곳에 대해서 나는 시도를 멈췄습니다 ... – MadProgrammer

답변

4

다음 예제는 아마도 사용자가 찾고자하는 것을 수행하는 가장 쉬운 방법 일 것입니다. 기본 JSlider/BasicSliderUI 구현에 문제가 있기 때문에 JSlider 서브 클래스에서 getValue()를 간단히 재정의하여 도메인 별 값을 반환 할 수는 없습니다. 이 예에서는 사용자 정의 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() 및 map 등을 오버라이드 (override)하는 JSlider의 서브 클래스를 기술합니다. [1,2,3,4] (원본)부터 [10,30,60,100]까지입니다. 내 마음에 오는 가장 간단한 솔루션.

+0

이것은 매우 위험합니다. 이것은' JSlider' (내부적으로 getValue() 메소드에 접근합니다). – brimborium

관련 문제