2011-12-26 7 views
5

में अजीब SpinnerNumberModel व्यवहार मैं मान = 0.0005 के साथ एक SpinnerNumberModel, न्यूनतम = 0.0, अधिकतम = 1.0, और कदम आकार = 0.0005 का उपयोग कर सेटअप करने के लिए कोशिश कर रहा हूँ एक JSpinner। हालांकि, जब मैं इन मानकों के साथ एक स्पिनर बनाता हूं तो मैं बहुत अजीब व्यवहार करता हूं। 0.0005 से शुरू होने और ऊपर तीर के प्रत्येक क्लिक के साथ 0.0005 से बढ़ने की बजाय, मान 0जावा

यह सुनिश्चित करने के लिए कि यह केवल एक स्वरूपण समस्या नहीं है, मैंने स्पिनर के मूल्य को मुद्रित किया प्रत्येक परिवर्तन घटना। निश्चित रूप से पर्याप्त, ऊपर तीर के प्रत्येक क्लिक के लिए, कंसोल मूल्य को 0 और फिर 0.0005 के रूप में दिखाता है, इस पर ध्यान दिए बिना कि स्पिनर कितनी बार क्लिक किया गया है।

नीचे कोड मैं थोड़ा अलग मानों तुलना प्रयोजनों के लिए बस ठीक काम करता है के साथ एक स्पिनर सहित इस परीक्षण करने के लिए, का उपयोग किया है है।

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import java.awt.*; 

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(200, 80); 
     JPanel panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)); 
     final JSpinner spinner2 = new JSpinner(new SpinnerNumberModel(0.05, 0.0, 1.0, 0.05)); 
     panel.add(spinner1, BorderLayout.NORTH); 
     panel.add(spinner2, BorderLayout.SOUTH); 
     frame.add(panel); 
     spinner1.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner1: " + ((Number) spinner1.getValue()).doubleValue()); 
      } 
     }); 
     spinner2.addChangeListener(new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("spinner2: " + ((Number) spinner2.getValue()).doubleValue()); 
      } 
     }); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

क्या कोई मुझे बता सकता है कि स्पिनर 2 इरादे के रूप में क्यों काम करता है, लेकिन स्पिनर 1 नहीं है?

धन्यवाद।

संपादित करें: उनका कहना है स्पिनर की पाठ क्षेत्र के स्वरूपण वास्तव में संग्रहीत मूल्य पर एक प्रभाव है कि के लिए पीटर के लिए धन्यवाद। इरादे के रूप में काम करने वाले पहले स्पिनर को पाने के लिए, मैंने लाइन जोड़ा: spinner1.setEditor(new JSpinner.NumberEditor(spinner1, "0.0000"));

+0

इनपुट के लिए धन्यवाद। वास्तविक परियोजना जहां मैंने पहली बार इस मुद्दे का सामना किया था उससे कहीं अधिक जटिल है। जिस कोड को मैंने यहां पोस्ट किया है वह एक बहुत ही नंगे हड्डियों का उदाहरण है जो इस मुद्दे का प्रदर्शन करता है। –

+0

ठीक है, मैंने दो स्पिनरों को पकड़ने के लिए जेपीनल को शामिल करने के लिए उदाहरण संपादित किया है। दुर्भाग्य से, मुझे अभी भी पहले स्पिनर के लिए वही जीतने वाले परिणाम मिलते हैं। –

+0

मैंने एक जेपीनल का उपयोग किया है और समस्या अभी भी बनी हुई है। मैंने JSPinner मॉडल (मूल्य, चरण) और (0.0001, 0.001) के रूप में (0.001, 0.0001) का उपयोग करने का प्रयास किया है। न तो काम करता है। लेकिन (0.001, 0.001) इसके बजाए काम करता है। क्या यह JSpinner प्रस्तुत करने की सटीकता की समस्या का तात्पर्य है? – xorange

उत्तर

9

समस्या स्पिनर द्वारा प्रयोग किया जाता JFormattedTextField में यह है। कि संपादक में आप पा सकते हैं:

public void commitEdit() throws ParseException { 
    AbstractFormatter format = getFormatter(); 

    if (format != null) { 
     setValue(format.stringToValue(getText()), false, true); 
    } 
} 

अपने स्पिनर प्रदर्शन 0.0005 के रूप में 0.0, अगर आप को बढ़ा देते यह पहली बार अपने मॉडल में 0.0 रखा और फिर 0.0005 करने के लिए वृद्धि कर देता है, तो आप घटना वास्तव में यह कब्जा लेकिन अपने पाठ फ़ील्ड केवल 0.0

देखता है

तो समाधान स्पिनर टेक्स्टफील्ड के स्वरूपण को बदलने के लिए होगा।

आप संपादक overide कर सकते हैं

final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)) { 
     @Override 
     protected JComponent createEditor(SpinnerModel model) 
     { 
     return new NumberEditor(this, "0.0000");//needed decimal format 
     } 
    }; 
+0

दिलचस्प ... मैंने माना कि स्पिनर ने टेक्स्ट फ़ील्ड द्वारा प्रारूपित किए जाने के बावजूद एक ही डबल सटीक मूल्य रखा है। धन्यवाद! –

+0

धन्यवाद पीटर। मैंने एक अतिरिक्त लाइन शामिल करने के लिए अपना प्रश्न संपादित किया जो समान उद्देश्य प्रदान करता है। –