2012-05-16 18 views
10

He creado una CustomTextField que se desplaza en sí hacia la izquierda cuando el tipo i de texto, que son de pago que el ancho del campo de texto para lo cual se utiliza un HorizonalFieldManager Pero ahora el problema es que si hago clic derecho con mi mouse y lo desplazo pasa a la longitud inadecuada pero no se detiene hasta la última palabra que escribo ¿Cuál es el problema aquí? ¿Es un errordesplazamiento horizontal y el campo de texto de error

Sólo necesito que para desactivar HorizontalScrolling cuando llega a la última palabra Debe ser capaz de desplazar sólo entre el inicio y el final de la última palabra en palabra

Salida del código

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); 
    } 

} 

he inicializado como

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

siento la necesidad de desplazamiento (se desplaza Func iones) para HorizontalFieldManager ... pero aún no han se acercó a la solución todavía Por favor, ayuda

+0

"RIGHT Click" ¿está utilizando el simulador? ¿Lo revisaste en el dispositivo? – Aditya

+0

Sí .. es el mismo en el dispositivo – Yatin

+0

@HeartBeat: ¿puedes resolver este? – Yatin

Respuesta

4

Así, en los campos de BlackBerry, el medida es la tamaño visual real de un campo. Pero, el extensión virtual es el tamaño lógico que puede usar, algunos de los cuales pueden no ser visibles. Para Managers que desea tener desplazamiento, normalmente establecería la extensión virtual para que sea más grande que la extensión.

Utilicé este concepto para cambiar dinámicamente la extensión virtual de su HorizontalFieldManager, basado en la cantidad de espacio que se necesitaba actualmente para ajustarse apenas al texto en el BasicEditField. Para hacer esto, tuve que dejar que el HorizontalFieldManager escuchara los cambios en el BasicEditField, implementando FieldChangeListener. Luego, a medida que se escribe cada carácter en el campo de edición, el administrador de campo horizontal recalculará cuánto ancho se necesita para la cantidad de texto que está ahora en el campo. Luego restablece el ancho virtual a ese ancho.

Esto hace que el administrador de campo horizontal solo permita desplazarse al final del texto ingresado, no a la derecha, que es cómo el código funcionó originalmente.

Por lo tanto, no creo que el BlackBerry estaba haciendo algo malo ... no hay errores en el sistema operativo. Anteriormente, la extensión virtual simplemente no estaba establecida.

Divido su HorizontalFieldManager en una nueva clase privada, porque no me gusta usar clases anónimas cuando la lógica excede unas 5 líneas de código. Entonces, la solución a continuación se ve un poco diferente.

Otros pensamientos:

1) Hay artefactos de dibujo, como resultado de su intento de trazar una frontera con una costumbre paint() aplicación. Pero, ese error estaba originalmente allí, e interpreté que esta pregunta era sobre el problema del desplazamiento. Parece que estabas tratando de usar los objetos Border, que es probablemente la mejor manera de lograr un borde para un campo de desplazamiento.

2) Con mi nueva solución, la clase real CustomTextField no tiene mucho.Es solo un contenedor (Manager) para el CustomHorizontalFieldManager. Probablemente podrías deshacerte de esa capa externa si quisieras. Pero, sé que a veces cuando publicas el código, eliminas detalles que no son importantes para la cosa con la que estás teniendo problemas. Entonces, tal vez tener un VerticalFieldManager contiene un HorizontalFieldManager que contiene un BasicEditField es necesario. Te lo dejo a ti ... solo sería opcional limpieza, sin embargo.

3) He probado esto en un simulador 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

¿Puede decirme dónde puedo codificar el Listener para Manager HorizontalFieldManager en mi código Si hago un nuevo oyente FieldChangeListener; Y agréguelo como hfm.setListener (oyente); – Yatin

+0

@YAK, ya está allí (en mi código anterior). Cambié tu 'HorizontalFieldManager' original a una nueva subclase privada,' CustomHorizontalFieldManager'. Esa clase implementa la interfaz 'FieldChangeListener', lo que significa que tiene un método' fieldChanged() '. Si miras mi código, ese método 'fieldChanged()' es donde calculo dinámicamente la longitud del texto en el campo de edición, y llamo a 'setVirtualExtent()'. Ese es todo el truco que uso para que esto funcione. Solo usa mi código. – Nate

+0

y solo para aclarar, no es el objeto hfm el que configura el oyente. es el campo de edición básico. así que ** dentro ** del constructor del administrador de campo horizontal, configuro el administrador de campo para que sea el oyente del campo de edición. así es como sabe cuándo ha cambiado el texto, y el ancho virtual debe aumentarse (o reducirse). – Nate

Cuestiones relacionadas