2009-02-05 8 views
13

के बाद स्थिति। (यदि स्लाइडर बिंदु 47 पर है और मैं 5 क्लिक करता हूं तो यह 5 के बजाय 37 पर कूद जाएगा)। JSliders का उपयोग करते समय इसे बदलने का कोई तरीका है, या क्या मुझे एक और डेटास्ट्रक्चर का उपयोग करना है?JSlider प्रश्न: जब भी मैं एक JSlider यह बजाय मौके मैं वास्तव में क्लिक करने के लिए कूद के क्लिक करने की दिशा में तैनात हो जाता है एक majorTick क्लिक leftclick

उत्तर

16

के रूप में विचित्र रूप में इस लग सकता है, यह वास्तव में देखो और महसूस जो इस व्यवहार को नियंत्रित करता है। BasicSliderUI पर एक नज़र डालें, जिस विधि को आपको ओवरराइड करने की आवश्यकता है वह scrollDueToClickInTrack(int) है।

जहां उपयोगकर्ता ट्रैक पर क्लिक किया के सबसे नजदीक मूल्य के लिए JSlider का मान सेट करने के लिए, आप कुछ फैंसी पैंट अनुवाद करने के लिए के बीच माउस एक वैध ट्रैक मूल्य के लिए getMousePosition() से निर्देशांक, आवश्यकता होगी ध्यान में रखकर Component की स्थिति को खाता करें, यह आदि के बीच अभिविन्यास, आकार और दूरी है। valueForXPosition(int xPos) और valueForYPosition(int yPos):

JSlider slider = new JSlider(JSlider.HORIZONTAL); 
slider.setUI(new MetalSliderUI() { 
    protected void scrollDueToClickInTrack(int direction) { 
     // this is the default behaviour, let's comment that out 
     //scrollByBlock(direction); 

     int value = slider.getValue(); 

     if (slider.getOrientation() == JSlider.HORIZONTAL) { 
      value = this.valueForXPosition(slider.getMousePosition().x); 
     } else if (slider.getOrientation() == JSlider.VERTICAL) { 
      value = this.valueForYPosition(slider.getMousePosition().y); 
     } 
     slider.setValue(value); 
    } 
}); 
+0

यह विचित्र विचित्र, अच्छा पकड़ है। स्क्रॉल करने के लिए इनपुट कैसे पता लगाने की कोशिश कर रहा है .. (int) बनाया गया है। दिशा निर्धारित करने के लिए वहां कुछ जांच होनी चाहिए जहां मैं स्लाइडरपोजिशन की तुलना में क्लिक करता हूं। इसके लिए निर्धारित करने के लिए कुछ विधि को यह जानने की ज़रूरत नहीं है कि स्लाइडर पर मैं कहां क्लिक करता हूं? –

+0

वास्तव में नहीं, दिशा आसान है - क्षैतिज ट्रैक के लिए इसे केवल यह जानने की आवश्यकता है कि माउस क्लिक का एक्स समन्वय स्लाइडर हैंडल के एक्स समन्वय से कम या उससे अधिक है। – ninesided

+0

हाँ, लेकिन यह जानने के लिए कि क्या यह एक्स समन्वय से कम या उससे अधिक है, आपको यह जानने की आवश्यकता नहीं होगी कि आप स्लाइडर पर तुलना करने के लिए क्लिक करते हैं? यदि स्लाइडर हैंडल 50 पर है तो आपको यह जानने की जरूरत है कि आप कहां क्लिक करते हैं कि यह स्थिति है या <50, नहीं? –

0

यह व्यवहार ओएस से ली गई है सौभाग्य से, BasicSliderUI हमें ऐसा करने के दो आसान कार्यों देता है। क्या आप वाकई इसे फिर से परिभाषित करना चाहते हैं और उपयोगकर्ताओं को भ्रमित करना चाहते हैं? मुझे ऐसा नहीं लगता। ;)

4

यह सवाल वर्ष की तरह है, लेकिन मैं सिर्फ अपने आप को इस समस्या भर में भाग गया। यह मेरा समाधान है:

JSlider slider = new JSlider(/* your options here if desired */) { 
    { 
     MouseListener[] listeners = getMouseListeners(); 
     for (MouseListener l : listeners) 
      removeMouseListener(l); // remove UI-installed TrackListener 
     final BasicSliderUI ui = (BasicSliderUI) getUI(); 
     BasicSliderUI.TrackListener tl = ui.new TrackListener() { 
      // this is where we jump to absolute value of click 
      @Override public void mouseClicked(MouseEvent e) { 
       Point p = e.getPoint(); 
       int value = ui.valueForXPosition(p.x); 

       setValue(value); 
      } 
      // disable check that will invoke scrollDueToClickInTrack 
      @Override public boolean shouldScroll(int dir) { 
       return false; 
      } 
     }; 
     addMouseListener(tl); 
    } 
}; 
+0

क्या इस समाधान का मतलब यह नहीं है कि अब आप स्लाइडर को स्थानांतरित करने के लिए स्क्रॉल व्हील का उपयोग नहीं कर सकते? – ninesided

+0

+1, मैंने माउसमोशन लिस्टनर को हटाने और जोड़ने के लिए थोड़ा बदलाव किया। यह एक मामूली कॉस्मेटिक परिवर्तन देता है जिसमें माउस स्लाइडर अंगूठे में केंद्रित रहेगा क्योंकि आप अंगूठे के बाएं किनारे पर कूदने के बजाए अंगूठे को खींचते हैं। – camickr

संबंधित मुद्दे