2012-05-16 16 views
10

मैं एक CustomTextField जो अपने आप में छोड़ दिया की ओर स्क्रॉल जब मैं पाठ जो TextField जिसके लिए एक HorizonalFieldManager प्रयोग किया जाता है लेकिन अब समस्या अगर मैं सही से क्लिक करें है की चौड़ाई से अतिरिक्त कर रहे हैं टाइप बनाया है मेरा माउस और इसे स्क्रॉल करें, यह अपर्याप्त लंबाई पर जाता है लेकिन पिछले शब्द को नहीं रोकता है जिसे मैं टाइप करता हूं, यहां समस्या क्या है ?? यह एक बगक्षैतिज स्क्रॉल और TextField त्रुटि

है मैं सिर्फ इतना है कि HorizontalScrolling निष्क्रिय करने के लिए जब यह अंतिम शब्द यह सिर्फ शुरुआत है और शब्द में अंतिम शब्द के अंत

कोड

चेक आउट के बीच स्क्रॉल करने में सक्षम होना चाहिए तक पहुँच जाता है की जरूरत है
import net.rim.device.api.ui.Color; 
import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.FocusChangeListener; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.XYEdges; 
import net.rim.device.api.ui.XYRect; 
import net.rim.device.api.ui.component.BasicEditField; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 
import net.rim.device.api.ui.container.VerticalFieldManager; 
import net.rim.device.api.ui.decor.Border; 
import net.rim.device.api.ui.decor.BorderFactory; 


public class CustomTextField extends VerticalFieldManager { 
    private int textWidth=0; 
    private int textHeight=0; 
    private BasicEditField basicEditField; 
    private HorizontalFieldManager hfm; 
    //Border border; 

    public CustomTextField(int width,int height) { 
     super(); 
     textWidth=width; 
     textHeight=height; 
     //border=BorderFactory.createSimpleBorder(new XYEdges(1, 1, 1, 1)); 


     hfm=new HorizontalFieldManager(Manager.HORIZONTAL_SCROLL){ 
      protected void sublayout(int maxWidth, int maxHeight) { 
       super.sublayout(maxWidth, maxHeight); 
       setExtent(textWidth, textHeight); 
      } 
     }; 
     basicEditField=new BasicEditField("","",200,BasicEditField.NO_NEWLINE); 
     //basicEditField.setBorder(border); 

     hfm.add(basicEditField); 
     add(hfm); 
    } 


    protected void sublayout(int maxWidth, int maxHeight) { 
     super.sublayout(textWidth, textHeight); 
     setExtent(textWidth, textHeight); 

    } 


    protected void paint(Graphics graphics) { 
     super.paint(graphics); 
     graphics.setColor(Color.BLACK); 
     graphics.drawRect(0,0, textWidth, textHeight); 
    } 

} 

मैं के रूप में

CustomTextField textField=new CustomTextField(200, 20); 
      add(textField); 

मैं स्क्रॉल (Funct स्क्रॉल है की जरूरत महसूस यह initialised है आयन) HorizontalFieldManager के लिए ... लेकिन अभी तक समाधान करने के लिए आया था नहीं किया है अभी तक मदद

+0

"दायाँ क्लिक" क्या आप सिम्युलेटर का उपयोग कर रहे हैं? क्या आपने इसे डिवाइस में चेक किया था? – Aditya

+0

हां .. डिवाइस – Yatin

+0

@HeartBeat में यह वही है: क्या आप इसे हल कर सकते हैं ?? – Yatin

उत्तर

4

कृपया तो, ब्लैकबेरी क्षेत्रों में, हद वास्तविक दृश्य एक क्षेत्र का आकार है। लेकिन, आभासी सीमातार्किक आकार का उपयोग कर सकते हैं, जिनमें से कुछ दिखाई नहीं दे सकते हैं। Managers के लिए जो आप स्क्रॉल करना चाहते हैं, आप आमतौर पर आभासी सीमा को सीमा से बड़े होने के लिए सेट करेंगे।

मैंने इस अवधारणा का उपयोग की वर्चुअल सीमा को गतिशील रूप से बदलने के लिए किया है, इस पर आधारित है कि वर्तमान में BasicEditField में टेक्स्ट को केवल फिट करने के लिए कितनी जगह की आवश्यकता थी। ऐसा करने के लिए, मुझे FieldChangeListener लागू करके HorizontalFieldManagerBasicEditField में परिवर्तनों को सुनना पड़ा। फिर, जैसा कि प्रत्येक वर्ण को संपादन फ़ील्ड में टाइप किया गया है, क्षैतिज फ़ील्ड मैनेजर फिर से गणना करेगा कि फ़ील्ड में मौजूद पाठ की मात्रा के लिए कितनी चौड़ाई की आवश्यकता है। फिर वह उस चौड़ाई के लिए वर्चुअल चौड़ाई को फिर से सेट करता है।

यह क्षैतिज क्षेत्र प्रबंधक केवल पाठ के अंत तक स्क्रॉलिंग की अनुमति देता है, दाईं ओर नहीं, जिस तरह मूल रूप से कोड काम करता है।

तो, मुझे नहीं लगता कि ब्लैकबेरी कुछ भी गलत कर रहा था ... ओएस में कोई बग नहीं। पहले, आभासी सीमा बस सेट नहीं किया गया था।

मैंने आपके क्षैतिज फ़ील्ड प्रबंधक को एक नए निजी वर्ग में विभाजित किया, क्योंकि मुझे अज्ञात कक्षाओं का उपयोग करना पसंद नहीं है जब तर्क कोड की लगभग 5 पंक्तियों से अधिक हो जाता है। तो, नीचे दिया गया समाधान थोड़ा अलग दिखता है।

अन्य विचार:

1) एक कस्टम paint() कार्यान्वयन के साथ एक सीमा आकर्षित करने के लिए अपने प्रयास के परिणामस्वरूप ड्राइंग कलाकृतियों हैं। लेकिन, वह बग मूल रूप से वहां था, और मैंने इस सवाल को स्क्रॉलिंग समस्या के बारे में बताया। ऐसा लगता है कि आप Border ऑब्जेक्ट्स का उपयोग करने की कोशिश कर रहे थे, जो शायद स्क्रॉलिंग फ़ील्ड के लिए सीमा प्राप्त करने का बेहतर तरीका है।

2) मेरे नए समाधान के साथ, वास्तविक CustomTextField कक्षा में इसमें बहुत कुछ नहीं है।यह CustomHorizontalFieldManager के लिए सिर्फ एक कंटेनर (Manager) है। यदि आप चाहें तो शायद उस बाहरी परत से छुटकारा पा सकते हैं। लेकिन, मुझे पता है कि कभी-कभी जब आप कोड पोस्ट करते हैं, तो आप उन विवरणों को हटाते हैं जिनके साथ आपको परेशानी हो रही है। तो, शायद VerticalFieldManager में HorizontalFieldManager है जिसमें BasicEditField आवश्यक है। मैं इसे आपके पास छोड़ दूंगा ... हालांकि यह केवल वैकल्पिक सफाई होगा।

3) मैंने 5.0 स्टॉर्म 2 सिम्युलेटर पर इसका परीक्षण किया।

import net.rim.device.api.ui.Color; 
import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.FieldChangeListener; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.component.BasicEditField; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 
import net.rim.device.api.ui.container.VerticalFieldManager; 
import net.rim.device.api.util.Arrays; 

public class CustomTextField extends VerticalFieldManager { 

    private int textWidth = 0; 
    private int textHeight = 0; 
    private CustomHorizontalFieldManager hfm; 

    public CustomTextField(int width, int height) { 
     super(); 

     textWidth = width; 
     textHeight = height; 

     hfm = new CustomHorizontalFieldManager(); 
     add(hfm); 
    } 

    protected void sublayout(int maxWidth, int maxHeight) { 
     super.sublayout(textWidth, textHeight); 
     setExtent(textWidth, textHeight); 
    } 

    protected void paint(Graphics graphics) { 
     // TODO: change me! 
     super.paint(graphics); 
     graphics.setColor(Color.BLACK); 
     graphics.drawRect(0, 0, textWidth, textHeight); 
    } 

    private class CustomHorizontalFieldManager extends HorizontalFieldManager implements FieldChangeListener { 

     private BasicEditField basicEditField; 
     /** the maximum virtual width of the edit field, based on the max num of chars */ 
     private int maxVirtualWidth; 

     public CustomHorizontalFieldManager() { 
     super(Manager.HORIZONTAL_SCROLL); 

     int maxNumChars = 200; 
     basicEditField = new BasicEditField("", "", maxNumChars, BasicEditField.NO_NEWLINE); 

     // determine how wide the field would need to be to hold 'maxNumChars', with the font 
     // in use ... just pick a long string of all W's, since that's usually the widest char 
     char[] buffer = new char[maxNumChars]; 
     Arrays.fill(buffer, 'W'); 
     String spacer = new String(buffer); 
     maxVirtualWidth = basicEditField.getFont().getAdvance(spacer); 

     // we need to listen as the user types in this field, so we can dynamically alter its 
     // virtual width 
     basicEditField.setChangeListener(this); 

     add(basicEditField); 
     } 

     protected void sublayout(int maxWidth, int maxHeight) { 
     super.sublayout(maxWidth, maxHeight); 
     // extent is the visible size, virtual extent can be wider if we want scrolling 
     setExtent(textWidth, textHeight); 
     setVirtualExtent(maxVirtualWidth, textHeight); 
     } 

     public void fieldChanged(Field f, int context) { 
     if (f == basicEditField) { 
      // recalculate how much virtual width the edit field needs, based on the 
      // current text content 
      int newWidth = basicEditField.getFont().getAdvance(basicEditField.getText()); 
      setVirtualExtent(newWidth, textHeight); 
     } 
     } 
    } 

} 
+0

क्या आप मुझे बता सकते हैं कि मैं अपने कोड में प्रबंधक क्षैतिज फ़ील्डमेनगर के लिए श्रोता को कहां कोड कर सकता हूं यदि मैं एक नया फील्ड चेंजलिस्टर श्रोता बनाता हूं; और इसे hfm.setListener (श्रोता) के रूप में जोड़ें; – Yatin

+0

@YAK, यह पहले से ही वहां है (ऊपर मेरे कोड में)। मैंने आपके मूल 'क्षैतिज फ़ील्ड प्रबंधक' को एक नए निजी उपclass, 'CustomHorizontalFieldManager' में बदल दिया। वह वर्ग 'FieldChangeListener' इंटरफ़ेस लागू करता है, जिसका अर्थ है कि इसमें' fieldChanged() 'विधि है। यदि आप मेरा कोड देखते हैं, तो 'fieldChanged()' विधि है जहां मैं संपादन क्षेत्र में टेक्स्ट की लंबाई की गतिशील गणना करता हूं, और 'setVirtualExtent() 'पर कॉल करता हूं। यह काम है जो मैं इस काम को करने के लिए उपयोग करता हूं। बस मेरे कोड का प्रयोग करें। – Nate

+0

और केवल स्पष्टीकरण के लिए, यह hfm ऑब्जेक्ट नहीं है जिसे आपने श्रोता सेट किया है। यह मूल संपादन क्षेत्र है। तो ** ** क्षैतिज क्षेत्र प्रबंधक के कन्स्ट्रक्टर के अंदर, मैं फ़ील्ड मैनेजर को संपादन क्षेत्र में श्रोता होने के लिए सेटअप करता हूं। इस तरह यह जानता है कि पाठ कब बदल गया है, और वर्चुअल चौड़ाई को बढ़ाने की आवश्यकता है (या कमी हुई है)। – Nate

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