2009-12-29 49 views
0

我有一個JSlider與65536不同的值。它適用於粗調和非常精細的調整(+/- 1使用上/下箭頭),但在中間很差。swing:JSlider但粗略/精細控制?

有沒有什麼會更好?我可以隱約想象用2個滑塊進行粗調+精細調整,但無法真正弄清楚如何讓他們一起工作。

回答

1

如何使用JSpinner而不是JSlider?使用SpinnerNumberModel,您可以設置步長,甚至可以動態更改步長。

如果您有多個控件,您甚至可以有兩個微調器,一個用於設置數值,另一個用於設置第一個微調器使用的步長。

對於這樣的一個例子,我把SliderDemo代碼從Swing slider tutorial和改性它,而不是使用兩個JSpinners而不是一個單一的JSlider。下面是我改變了代碼的最有趣的部分:

//Create the slider^H^H^H^H^H^H spinners. 
// JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 
//          FPS_MIN, FPS_MAX, FPS_INIT); 
final int initStep = 1; 
final SpinnerNumberModel animationModel = new SpinnerNumberModel(FPS_INIT, 
                   FPS_MIN, 
                   FPS_MAX, 
                   initStep); 
final SpinnerNumberModel stepSizeModel = new SpinnerNumberModel(initStep, 
                   1, 
                   10, 
                   1); 
final JSpinner framesSpinner = new JSpinner(animationModel); 
framesSpinner.addChangeListener(this); 

final JSpinner stepSpinner = new JSpinner(stepSizeModel); 
stepSpinner.addChangeListener(new ChangeListener() 
{ 
    public void stateChanged(ChangeEvent arg0) 
    { 
     animationModel.setStepSize(stepSizeModel.getNumber()); 
    } 
}); 

我也不得不做出一堆不太有趣的變化,如創建爲步長微調標籤,添加新標籤和新的微調器並更改方法this,以將事件來源轉換爲JSpinner,而不是將其轉換爲JSlider

當然,您可以詳細闡述此問題,例如增加步長微調器的步長(例如,以便您可以通過單擊將步長從1更改爲101)。您還可以使用其他控件而不是JSpinner來設置步長,例如組合框。

最後,爲了使這一切非常容易使用,您可能需要連接一些按鍵加速器(可能通過菜單?),以便您可以更改步長而無需實際移動鼠標或鍵盤焦點一個微調到另一個。

編輯:既然你必須使用一個JSlider不管是什麼,你知道,你可以用PgUp/PgDn鍵上下移動1/10 日總範圍的

如果你想改變那個1/10 th的數量(比如使它變成動態的),那麼你需要重寫方法BasicSliderUI.scrollByBlock()

這裏就是我剛剛推翻的UI類JSlider的步驟由1/4範圍一個例子,而不是1/10

//Create the slider. 
JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 
             FPS_MIN, FPS_MAX, FPS_INIT); 
framesPerSecond.setUI(new javax.swing.plaf.metal.MetalSliderUI() { 

    private static final int SLIDER_FRACTION = 4; 

    /** 
    * This code is cut, paste, and modified from 
    * {@link javax.swing.plaf.basic.BasicSliderUI#scrollByBlock(int). 
    * I should be ashamed of cutting and pasting, but whoever hardcoded the magic 
    * number "10" in the original code should be more ashamed than me. ;-) 
    * 
    * @param direction 
    *   either +1 or -1 
    */ 
    @Override 
    public void scrollByBlock(final int direction) { 
     synchronized(slider) { 
      int oldValue = slider.getValue(); 
      int blockIncrement = (slider.getMaximum() - slider.getMinimum())/SLIDER_FRACTION; 
      if (blockIncrement <= 0 && slider.getMaximum() > slider.getMinimum()) { 
       blockIncrement = 1; 
      } 
      int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL); 
      slider.setValue(oldValue + delta);   
     } 
    } 
}); 

從這裏用另一個滑塊或微調器設置的變量代替常量SLIDER_FRACTION不會太難,是不是?

+0

謝謝,我也喜歡spinners,但我需要在這個應用程序中的滑塊。也許一個微調+滑塊組合會很好。 – 2010-03-03 16:35:08

+0

如果您絕對必須使用滑塊,那麼也許您可以通過動態修改滴答間距並啓用捕捉到滴答行爲來獲得所需的行爲?我不確定這是如何與使用滑塊上的箭頭鍵相互作用的,但值得研究。 – 2010-03-04 01:15:42

+0

好吧,我想出了一個方法來做這件事,只是'JSlider',我相應地編輯了我的答案。感謝您挑戰我尋找更好的解決方案。 :-) – 2010-03-04 02:43:00