0

样本:

private Widget getSelectBox() {
  HorizontalPanel hPanel = new HorizontalPanel();
  hPanel.setSpacing(20);
  final ListBox dropBox = new ListBox(false);
  String[] listTypes = {"1", "2", "3"};
  for (int i = 0; i < listTypes.length; i++) {
    dropBox.addItem(listTypes[i]);
  }
  dropBox.ensureDebugId("cwListBox-dropBox");
  dropBox.getElement().setId("cms-dropBox");
  VerticalPanel dropBoxPanel = new VerticalPanel();
  dropBoxPanel.setSpacing(4);
  dropBoxPanel.add(dropBox);
  hPanel.add(dropBoxPanel);
  dropBox.addChangeHandler(new ChangeHandler() {
    public void onChange(ChangeEvent event) {
      Window.alert("change fired");
      dropBox.addItem("else");
      consoleLog("selected: "+ dropBox.getSelectedIndex());
    }
  });  
  return hPanel;
}

ChangeHandler 不起作用。尽管在官方示例中它工作正常(http://samples.gwtproject.org/samples/Showcase/Showcase.html#!CwListBox )。但它在这段代码中不起作用。没有错误。

DOM.sinkEvents((com.google.gwt.user.client.Element) dropBox.getElement(), Event.ONCHANGE );
DOM.setEventListener((com.google.gwt.user.client.Element) dropBox.getElement(), new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
        if (DOM.eventGetType(event) == Event.ONCHANGE) {
              Window.alert("change fired");
              dropBox.addItem("who");
              consoleLog("selected: "+ dropBox.getSelectedIndex());                                        
        }                                             
    }
}); 

这种方式也行不通。

upd:在 MainEntryPoint 类中所有工作,但需要 panel.add(new SomeClass().getWidget()),这不起作用

4

2 回答 2

0

因此,您只需ChangeEvent要从另一个类中连接一个 ListBox。你可以通过很多方式做到这一点。这里有两个简单的方法。

假设在 中定义了一个 ListBox,class A并且您需要在class B.

  • 第一种方法:公开一个 ListBoxclass A并使用它class B来设置处理程序。
  • 第二种方法:添加一个公共方法,class A在 ListBox 上设置一个处理程序,这将用于class B.

您需要将 的实例传递class A给 的构造函数class B


public class A {
    private ListBox dropBox;

    public A() {
        // constructor - set up dropBox
        ...
    }

    // first method - expose a dropBox
    public ListBox getDropBox() {
        return dropBox;
    }

    // second method - allow external handlers
    public HandlerRegistration addListBoxChangeHandler(ChangeHandler handler) {
        return dropBox.addChangeHandler(handler);
    }
}

public class B {
    private A instanceOfClassA;

    public B(A instanceOfClassA) {
        // constructor
        this.instanceOfClassA = instanceOfClassA;
        ...

        // first method - dropBox is exposed in class A
        instanceOfClassA.getDropBox().addChangeHandler(handler);

        // second method - add external handler
        instanceOfClassA.addListBoxChangeHandler(handler);
    }
}

第二种方法更优雅。

于 2016-09-14T17:49:00.563 回答
0

eventListener 不工作的原因:注意力不集中。

不要像 container.getElement().setInnerHTML(container.getElement().getInnerHTML()+"<div>somehtml</div>");在添加任何带有 eventListener 的小部件之后那样覆盖准备好的 DOM 的 html 内容

于 2016-09-17T02:57:07.180 回答