2010-12-16 7 views
5

Ich habe ein kleines Problem mit meinem JSlider, das ich nicht lösen konnte. Um die Situation ein wenig zu erklären, muss ich einen JSlider machen, der von 0 bis 20 durch 0,1 Schritte geht. Ich habe meinen Weg aus Problemen gelöst, indem ich einen JSlider von 0 bis 200 erstellt habe und die Beschriftungen unter dem Schieberegler neu definiert habe, um die korrekten Prozentwerte anstelle der ganzzahligen Werte anzuzeigen.Wert über Daumen in JSlider entfernen

Aber ich habe ein letztes Problem: Ich benutze eine benutzerdefinierte L & F (die ich nicht ändern kann, offensichtlich, wie es vom Client ist), die den Wert über den Schieberegler Daumen anzeigt. Dieser Wert wird jedoch ... in seiner Standardform als Ganzzahl angezeigt. Von dem, was ich verstehen konnte, bezieht sich diese Anzeige auf die Slider.paintValue Eigenschaft, wie ich in javax.swing.plaf.synth.SynthSliderUI Quellcode sehen kann. Ich konnte es jedoch nicht dramatisch entfernen.

Was ich jetzt versucht:

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

Keiner der beiden etwas geändert.

Gibt es hier in der Nähe einen Swing-Guru, der mich da rausholen könnte?

+0

Würden Sie einen SSCCE veröffentlichen? – jzd

+0

Hmm, das kann ich nicht wirklich machen, das ist kommerzieller Code. Außerdem mache ich nur einen JSlider und versuche dann, ihn zu setzen. SSCCE trifft hier nicht wirklich zu. –

Antwort

3

Ich habe gerade eine Demo mit einer JSlider erstellt und mit dem grundlegenden Synth LAF, und ich kann bestätigen, dass die Einstellung dieser Eigenschaften scheint überhaupt keine Wirkung, was ist seltsam, und auch sehr nervig.

Ich habe bei SynthSliderUI sah, und ich kann die protected boolean paintValue eingestellt wird in private void updateStyle(JSlider c), sehen also, wenn Sie diese Klasse eine benutzerdefinierte Erweiterung machen waren, den Wert von paintValue auf false, und stellen Sie dann UI Ihre Schiebereglers auf die neue Benutzeroberfläche mit setUI(), könnten Sie näher kommen. Entweder das, oder überschreiben Sie die Malmethoden vollständig, indem Sie Code aus dem Original kopieren, aber den Teil entfernen, der den Daumenwert darstellt.

Jetzt ist SynthSliderUI selbst Paket-private, aber das ist nicht wirklich das Problem sowieso, da Sie einen Client bereitgestellten LAF verwenden. Wenn die benutzerdefinierte UI-Klasse des Sliders öffentlich und nicht final ist, können Sie wie oben beschrieben eine gehackte Version erstellen und sie auf Ihren Slider anwenden.

Wenn es endgültig ist, dann können Sie Reflection verwenden, um das Feld paintValue als letzten Ausweg zu ändern (vielleicht kurz bevor Sie Ihren Slider malen). Die folgende Hack funktioniert für mich (nehmen Sie die Reflexion Anruf aus, die das Feld auf false setzt der Daumen Wert wird gemalt, um zu sehen):

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

Heiliger Mist, warum sollte ich nicht darüber nachdenken, dies zu tun? Ich denke, Ihre Lösung könnte funktionieren. Sobald ich die Zeit habe, es zu testen, werde ich es dir sagen und die beantwortete Frage markieren. –

+0

Mann, du hast mir wirklich das Leben gerettet. Es tut mir leid, dass ich Ihnen diese Frage nicht beantworten konnte. Ich hätte Ihnen wirklich gerne ein wenig mehr Reputation gegeben. Nachdem ich hier viele Fragen beantwortet habe, ist dies eine der ersten, die ich gefragt habe, und ich bin so glücklich. Danke noch einmal ! –

+0

Kein Problem. :) Es ist erschreckend, wie oft Reflection in solchen Situationen zur Rettung kommt! – BoffinbraiN

2

Aufruf UIManager.put("Slider.paintValue", false) vor dem Aufruf von initComponents() für mich gearbeitet.