2010-12-16 3 views
5

해결할 수 없었던 JSlider에 약간의 문제가 있습니다. 상황을 조금 설명하기 위해, 나는 0.1 단계를 거쳐 0에서 20까지 진행되는 JSlider를 수행해야한다. 나는 JSlider를 0에서 200까지 생성하여 문제를 해결하고 슬라이더 아래에 레이블을 재정 의하여 정수 값 대신 corrent 비율을 표시했습니다.JSlider의 엄지 손가락에 표시되는 값 제거

마지막 문제가 있습니다. 사용자 정의 L & F (클라이언트에서 변경된 것처럼 변경할 수 없음)를 사용하고 있습니다.이 값은 슬라이더 썸 위로 값을 표시합니다. 그러나이 값은 표준 방법으로 정수로 표시됩니다. 내가 이해할 수 있었던 것부터이 디스플레이는 Slider.paintValue 속성과 관련이 있습니다. javax.swing.plaf.synth.SynthSliderUI 소스 코드에서 볼 수 있습니다. 그러나, 나는 그것을 극적으로 제거 할 수 없었습니다.

내가 지금 시도했다 : 그 두 가지의

UIManager.getLookAndFeelDefaults().put("Slider.paintValue", false); 
UIManager.put("Slider.paintValue", false); 

없음 아무것도 변경되지 않습니다.

여기에서 나를 빼낼 수있는 스윙 전문가가 있습니까?

+0

SSCCE를 게시 하시겠습니까? – jzd

+0

음,이 코드는 상업 코드이므로 실제로 그렇게 할 수는 없습니다. 게다가, 내가하는 유일한 일은 JSlider를 생성 한 다음 그것을 설정하려고하는 것입니다. SSCCE는 실제로 여기에 적용되지 않습니다. –

답변

3

방금 ​​JSlider이라는 데모를 만들고 기본 Synth LAF를 사용하여 데모를 만들었으므로이 속성을 설정해도 아무런 효과가없는 것으로 나타났습니다. 이는 이상하고 매우 귀찮습니다.

내가 SynthSliderUI 살펴 보았다하고, 사용자 정의 확장이 수업을했다 false로 paintValue의 값을 설정 한 다음 새로운 UI에 슬라이더의 UI를 설정 그래서 만약 내가의 protected boolean paintValueprivate void updateStyle(JSlider c)에서 설정되는 것을 볼 수 있습니다 setUI()으로 가까워 질 수 있습니다. 그 중 하나, 또는 페인트 방법을 완전히 재정 의하여 원본에서 코드를 복사하지만 엄지 손가락 값을 칠하는 부분을 제거하십시오.

이제 SynthSliderUI 자체는 패키지 전용이지만 클라이언트 제공 LAF를 사용하고 있기 때문에 실제로는 문제가되지 않습니다. 커스텀 슬라이더 UI 클래스가 public이고 final이 아닌 경우 위에서 설명한대로 해킹 된 버전을 만들어 슬라이더에 적용 할 수 있습니다.

최종 버전 인 경우 리플렉션을 사용하여 마지막 수단으로 (아마도 슬라이더를 그리기 전에) paintValue 필드를 변경할 수 있습니다. initComponents()에 대한 호출이 나를 위해 일하기 전에

import java.awt.BorderLayout; 
import java.lang.reflect.Field; 

import javax.swing.JFrame; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class SliderDemo { 

    public static void main(String[] args) throws Exception { 
     UIManager.setLookAndFeel("javax.swing.plaf.synth.SynthLookAndFeel"); 

     Class<?> sliderUIClass = Class.forName("javax.swing.plaf.synth.SynthSliderUI"); 
     final Field paintValue = sliderUIClass.getDeclaredField("paintValue"); 
     paintValue.setAccessible(true); 

     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setLayout(new BorderLayout()); 

       JSlider slider = new JSlider(3, 6, 4); 
       try { 
        paintValue.set(slider.getUI(), false); 
       } catch (Exception e) { 
        throw new RuntimeException(e); 
       } 
       f.add(slider, BorderLayout.CENTER); 

       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 

}
+0

이런 젠장, 왜 이런 일을하기 위해 리플렉션을 사용하지 않았을까? 나는 당신의 솔루션이 효과가있을 것이라고 생각합니다. 내가 테스트 할 시간을 얻 자마자, 나는 당신에게 말할 것이고 대답하는 것을 표시 할 것이다 :) –

+0

남자, 당신은 정말로 이것에 나의 삶을 살렸다. 이 질문에 현상금을 넣을 수 없게 되서 미안해, 나는 너에게 조금 더 많은 인사를 해주는 것을 정말 좋아했을 것이다. 여기에 많은 질문에 답한 후에, 이것은 내가 처음으로 물어 본 것 중 하나이며, 나는 너무 행복합니다. 다시 한 번 감사드립니다! –

+0

문제 없습니다. :) 이런 종류의 상황에서 반사가 얼마나 자주 구조에 오는 지 무서울 것입니다! – BoffinbraiN

2

UIManager.put("Slider.paintValue", false) 호출 다음 해킹 (엄지 값이 페인트되는 것을 볼 false로 필드를 설정하는 반사 전화를 꺼내) 나를 위해 작동합니다.

관련 문제