Как программно открыть список GWT? - PullRequest
1 голос
/ 01 апреля 2012

У меня есть пользовательская форма с большим списком gwt. Форма похожа на форму Excel с именованным списком. Это некрасиво и стрелы имеют место.

Я бы хотел, чтобы клетки были как в Excel. Стрелка появляется только при нажатии на ячейку.

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

Теперь будет здорово, если при нажатии на текстовое поле, список будет отображаться уже открытым.

В приведенном ниже коде я пытаюсь сделать это в методе onClick с этой строкой:

DomEvent.fireNativeEvent(event.getNativeEvent(), listBox);

Но это не имеет никакого эффекта. У кого-нибудь есть решение?

public class CustomListBox extends Composite implements ClickHandler,
    ChangeHandler, HasChangeHandlers {

private final StringListBox listBox;
private final TextBox textBox;
private final DeckPanel panel;

public CustomListBox() {
    textBox = new TextBox();
    textBox.addClickHandler(this);
    textBox.setReadOnly(true);

    listBox = new StringListBox();
    listBox.addChangeHandler(this);
    panel = new DeckPanel();

    panel.add(textBox);
    panel.add(listBox);
    panel.showWidget(0);

    // All composites must call initWidget() in their constructors.
    initWidget(panel);
}

@Override
public void onClick(ClickEvent event) {
    Object sender = event.getSource();

    if (sender == textBox) {
        panel.showWidget(1);
        DomEvent.fireNativeEvent(event.getNativeEvent(), listBox);
    }
}

public void addItem(String item) {
    listBox.addItem(item);
}

public int getSelectedIndex() {
    return listBox.getSelectedIndex();
}

public String getItemText(int selectedIndex) {
    return listBox.getItemText(selectedIndex);
}

@Override
public HandlerRegistration addChangeHandler(ChangeHandler handler) {
    return listBox.addChangeHandler(handler);
}

@Override
public void onChange(ChangeEvent event) {
    Object sender = event.getSource();
    if (sender == listBox) {
        textBox.setText(getItemText(getSelectedIndex()));
        panel.showWidget(0);
    }
}
}

1 Ответ

0 голосов
/ 02 апреля 2012

Поскольку вы уже программируете свой собственный виджет, почему бы вам не пройти весь путь.Не меняйте текстовое поле для виджета со списком.Вместо текстового поля используйте метку.При наведении указателя мыши добавьте стрелку на фон метки, а затем используйте popupPanel для самого списка.В popupPanel вы можете делать элементы списка как угодно, просто убедитесь, что когда вы нажимаете на него, он устанавливает текст в вашей оригинальной метке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...