Pregunta

Estoy usando GWT / GXT y tratando de crear una "normal" ComboBox - uno que no se puede escribir, pero que puede escribir un único carácter y pasará automáticamente al primer elemento de la lista que empieza por esa letra. Por lo tanto, no quiero que READONLY, lo quiero por lo que no se puede reemplazar el texto en él con su propio texto (no se puede escribir caracteres en ella).

No se puede encontrar la manera de llegar ComboBox o SimpleComboBox para hacer esto. He probado todas las combinaciones de configuración de que en vano. Yo veo que hay un ListBox GXT, pero necesito un componente que se extiende desde el campo.

¿Realmente no hay manera de hacer esto o me estoy perdiendo algo?

¿Fue útil?

Solución 3

ListBox hace lo que estaba buscando -. Que es no editable y puede pulsar una tecla mientras se centra y se va a ir a la siguiente coincidencia

Otros consejos

Mensaje viejo, pero esto es muy frustrante, estoy de acuerdo. El siguiente es probablemente lo que usted está buscando.

SimpleComboBox<String> names = new SimpleComboBox<String>();
names.add( "Brian" );
names.add( "Kevin" );
names.add( "Katie" );
names.setTriggerAction( TriggerAction.ALL );

Mediante el uso de setEditable(false) y setForceSelection(true) y extendiendo la clase, se puede lograr esto por sí mismo (al observar las pulsaciones de teclas en el widget).

En primer lugar, la subclase:

package net.binarymuse.gwt.gxt.client;

import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;

public class MySimpleComboBox<T extends String> extends SimpleComboBox<T> {

    public MySimpleComboBox() {
        super();
        this.addKeyListener(new KeyListener(){
            @Override
            public void componentKeyDown(ComponentEvent event)
            {
                // Get a reference to the combobox in question
                MySimpleComboBox<T> combo = MySimpleComboBox.this;

                // Get the character that has been pressed
                String sChar = String.valueOf((char) event.getKeyCode());
                // TODO - add some checking here to make sure the character is
                //        one we actually want to process

                // Make sure we have items in the store to iterate
                int numItems = combo.getStore().getCount();
                if(numItems == 0)
                    return;

                // Check each item in the store to see if it starts with our character
                for(int i = 0; i < numItems; i++)
                {
                    String value = combo.getStore().getAt(i).getValue();
                    // If it does, select it and return
                    if(value.startsWith(sChar) || value.startsWith(sChar.toUpperCase()))
                    {
                        MySimpleComboBox.this.setSimpleValue((T) value);
                        return;
                    }
                }
            }
        });
    }

}

Y la prueba:

package net.binarymuse.gwt.gxt.client;

import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;


public class GxtSandbox implements EntryPoint {

    public void onModuleLoad() {
        SimpleComboBox<String> box = new MySimpleComboBox<String>();
        box.add("One");
        box.add("Two");
        box.add("Three");
        box.setEditable(false);
        box.setForceSelection(true);

        RootPanel.get().add(box);
    }
}

Dar el cuadro combinado enfoque y pulsando la tecla "T" debe seleccionar "dos" en la lista.

Como es, la clase siempre se selecciona el primer elemento de la lista que comienza con el carácter; Sin embargo, no sería difícil modificarlo para que sea seleccionar el siguiente elemento de la lista (como es típico con los cuadros combinados "reales").

El uso de ListBox es buena, pero es GWT, no GXT (al menos para GXT 2.2.5 no es ListBox). Para este tipo de situaciones en las que usted tiene que utilizar la API COSIDER GXT siguiente código (que funciona, he probado):

SimpleComboBox<MyEmumType> simpleComboBox = new SimpleComboBox<MyEmumType>();
List<MyEmumType> values = Arrays.asList(MyEmumType.values());
//here you set all values
simpleComboBox.add(values);
//here set first to display. it does not add new, just display one from collection
simpleComboBox.setSimpleValue(values.iterator().next());
//prevent combobox for setting/searching values out of collection
simpleComboBox.setEditable(false);
//disable autocomplete, with first value it will display all others
simpleComboBox.setTriggerAction(ComboBox.TriggerAction.ALL);

P.S. Tengo utilizar una enumeración aquí, pero creo que las obras de código con otros tipos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top