GWT SelectBox ChangeHandler事件不起作用

时间:2016-09-13 20:03:42

标签: gwt gwt-2.5 gwt-2.8

样品:

i_in  = np.nonzero(  (data_array[1:] - data_array[:-1]) ==  1   )[0] +1
i_out = np.nonzero(  (data_array[1:] - data_array[:-1]) == -1   )[0] +1

i_return_in_time = (i_in - i_out[:i_in.size] ) 

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

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

这种方式既不起作用。

upd:所有在MainEntryPoint类中都有效,但是需要panel.add(new SomeClass()。getWidget()),这是不行的

2 个答案:

答案 0 :(得分:0)

因此,您只需要从另一个类连接一个ListBox ChangeEvent。你可以通过很多方式实现这一目标。这是两种简单的方法。

我们假设在class A中定义了一个ListBox,并且您需要class B中的处理程序。

  • 第一种方法:从class A公开一个ListBox,并在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);
    }
}

第二种方法更优雅。

答案 1 :(得分:0)

不使用eventListener的原因:注意力不集中。

在使用eventListener

添加任何小部件之后,不要覆盖像<?php // Creates a page full of jpg images found in the specified directory (current one if none specified) function showFiles($findMe) { foreach (glob($findMe) as $filename) echo "<img src='$filename'/>"; } showFiles("*.jpg"); ?> 这样的现成DOM的html内容