如何以编程方式打开gwt列表框?

时间:2012-04-01 18:01:33

标签: gwt listbox

我有一个包含大量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 :(得分:0)

由于您已经编写了自己的小部件,为什么不一直这样做。不要换出列表框小部件的文本框。而不是文本框使用标签。鼠标悬停时,在标签背景中添加箭头,然后使用popupPanel作为列表本身。在popupPanel中,您可以随意制作列表项,只需确保在单击它时,它会在原始标签中设置文本。