Как создать нередактируемый GXT ComboBox? - PullRequest
4 голосов
/ 25 марта 2010

Я использую GWT / GXT и пытаюсь создать «нормальный» ComboBox - тот, который вы не можете ввести, но вы можете ввести один символ, и он автоматически перейдет к первому элементу в списке, который начинается с этого письмо. Итак, я не хочу это ЧИТАТЬ, Я хочу, чтобы вы не могли заменить текст в нем своим собственным текстом (не можете вводить в него символы).

Я не могу понять, как заставить ComboBox или SimpleComboBox сделать это. Я пробовал каждую комбинацию настроек на этом безрезультатно. Я видел, что есть GXT ListBox, но мне нужен компонент, который расширяет поле.

Неужели нет способа сделать это или я что-то упустил?

Ответы [ 4 ]

5 голосов
/ 18 августа 2012

Старый пост, но это очень расстраивает, я согласен. Ниже, вероятно, то, что вы ищете.

SimpleComboBox<String> names = new SimpleComboBox<String>();
names.add( "Brian" );
names.add( "Kevin" );
names.add( "Katie" );
names.setTriggerAction( TriggerAction.ALL );
4 голосов
/ 29 марта 2010

Используя setEditable(false) и setForceSelection(true) и расширяя класс, вы можете выполнить это самостоятельно (наблюдая за нажатиями клавиш на виджете).

Во-первых, подкласс:

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

}

И тест:

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

Если выделить фокус поля со списком и нажать «T», в списке нужно выбрать «Два».

Как есть, класс всегда выбирает первый элемент в списке, который начинается с символа; тем не менее, не составит труда изменить его, чтобы он выбрал следующий элемент в списке (как обычно для «настоящих» комбинированных окон).

2 голосов
/ 06 декабря 2015

Использование ListBox хорошо, но это gwt, а не gxt (по крайней мере, для gxt 2.2.5 нет ListBox). Для таких ситуаций, когда вам нужно использовать gxt api cosider следующий код (он работает, я проверял):

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. Я использовал здесь enum, но думаю, что код работает с другими типами.

2 голосов
/ 03 октября 2012

ListBox делает то, что я искал - он не редактируется, и вы можете нажать клавишу, пока она находится в фокусе, и она перейдет к следующему совпадению.

...