2012-05-16 4 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 ион) для HorizontalFieldManager ... но еще не пришел к решению еще Пожалуйста, помогите

+0

«ПРАВИЛЬНЫЙ НАЖМИТЕ» вы используете тренажер? Вы проверили его на устройстве? – Aditya

+0

Да .. его то же самое на устройстве – Yatin

+0

@HeartBeat: вы можете решить эту проблему ?? – Yatin

ответ

4

Так, в полях BlackBerry, то степень является фактическим визуальным размера поля. Но, виртуальной протяженности является логический размер, который он может использовать, некоторые из которых могут быть не видны. Для Managers, что вы хотите иметь прокрутку, вы обычно устанавливаете виртуальную степень больше, чем размер.

Я использовал эту концепцию для динамического изменения виртуальной протяженности вашего HorizontalFieldManager, основываясь на том, сколько пространства в настоящее время требуется, чтобы едва соответствовать тексту в BasicEditField. Чтобы сделать это, я должен был позволить HorizontalFieldManager прослушать изменения в BasicEditField, выполнив FieldChangeListener. Затем, когда каждый символ вводится в поле редактирования, диспетчер горизонтального поля пересчитывает, сколько ширины требуется для количества текста, который теперь находится в поле. Затем он снова устанавливает виртуальную ширину в эту ширину.

Это приводит к тому, что диспетчер горизонтального поля разрешает прокрутку только до конца введенного текста, а не справа, так как исходный код был выполнен.

Итак, я не думаю, что BlackBerry делал что-то неправильно ... нет ошибки в ОС. Раньше виртуальная степень просто не была установлена.

Я разделил свой HorizontalFieldManager на новый частный класс, потому что мне не нравится использовать анонимные классы, когда логика превышает примерно 5 строк кода. Итак, приведенное ниже решение выглядит несколько иначе.

Другие мысли:

1) Есть чертежные артефакты в результате вашей попытки нарисовать границу с настраиваемой paint() реализации. Но эта ошибка была изначально там, и я решил этот вопрос о проблеме прокрутки. Похоже, вы пытались использовать объекты Border, что, вероятно, является лучшим способом достижения границы для поля прокрутки.

2) С моим новым решением у фактического класса CustomTextField его нет.Это всего лишь контейнер (Manager) для CustomHorizontalFieldManager. Возможно, вы могли бы избавиться от этого внешнего слоя, если хотите. Но я знаю, что иногда, когда вы отправляете код, вы удаляете детали, которые не важны для того, с чем вы столкнулись. Таким образом, возможно наличие VerticalFieldManager содержит HorizontalFieldManager, который содержит BasicEditField. Я оставлю это вам ... это будет только необязательно cleanup.

3) Я тестировал это на симуляторе 5.0 Storm2.

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

Можете ли вы сказать мне, где я могу закодировать Listener для менеджера HorizontalFieldManager в моем коде Если я создаю нового слушателя FieldChangeListener; И добавьте его как hfm.setListener (слушатель); – Yatin

+0

@YAK, он уже там (в моем коде выше). Я изменил ваш оригинальный «HorizontalFieldManager» на новый частный подкласс «CustomHorizontalFieldManager». Этот класс реализует интерфейс 'FieldChangeListener', что означает, что он имеет метод' fieldChanged() '. Если вы посмотрите на мой код, этот метод 'fieldChanged()', где я динамически вычисляю длину текста в поле редактирования и вызываю 'setVirtualExtent()'. Это трюк, который я использую для выполнения этой работы. Просто используйте мой код. – Nate

+0

и просто для уточнения, это не объект hfm, на который вы устанавливаете слушателя. это основное поле редактирования. поэтому ** внутри ** конструктор диспетчера горизонтального поля, я настраиваю полевого менеджера как слушателя в поле редактирования. это то, как он знает, когда текст изменился, и виртуальная ширина должна быть увеличена (или уменьшена). – Nate