2016-09-13 2 views
0

Примера:GWT переключатель ChangeHandler событие не работает

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, и это не работает

+0

Ну, я просто проверял свой первый пример, и он отлично работает (появляется окно предупреждения и «еще» варианта добавлен). Я только что прокомментировал вызов 'consoleLog'. Вы уверены, что в GWT и в консоли браузера нет ошибок? – Adam

+0

привет! Ну, да, он должен работать над документацией, поэтому мой мозг взрывается - я в приложении, он не дает никаких ошибок и не работает так, как если addChangeHandler отсутствует. поэтому я даже не знаю, как отследить проблему. consoleLog - это просто «native void consoleLog (String text)) /* - { console.log (текст); } - * /;" – Jack

+0

все работает в классе MainEntryPoint, но panel.add (новый SomeClass(). getWidget ()) нужна, и это не работает. – Jack

ответ

0

причина не срабатывания eventListener: невнимательность.

не отменяет HTML содержания готового DOM как container.getElement().setInnerHTML(container.getElement().getInnerHTML()+"<div>somehtml</div>"); после добавления любого виджета с EventListener

0

Итак, вам просто нужно подключить ListBox ChangeEvent из (новый SomeClass() getWidget().) другой класс. Вы можете сделать это во многих отношениях. Вот два простых метода.

Предположим, что ListBox определен в class A, и вам нужен обработчик в class B.

  • Первый метод: подвергать ListBox из class 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); 
    } 
} 

Второй метод является более элегантным.

+0

спасибо большое !!! – Jack

+0

'private Widget getBox() { HorizontalPanel hPanel = new HorizontalPanel(); MainEntryPoint.dropBox = новый ListBox(); String [] lTypes = {"R", "S"}; для (String s: lTypes) MainEntryPoint.dropBox.addItem (s); VerticalPanel dropBoxPanel = новый VerticalPanel(); dropBoxPanel.add (MainEntryPoint.dropBox); hPanel.add (dropBoxPanel); MainEntryPoint.addListBoxChangeHandler (новый ChangeHandler() { общественного недействительными OnChange (ChangeEvent событие) { Window.alert ("выстрелил");} }); возвращение hPanel; } ' – Jack

+0

Если я правильно понял, в первом методе мы определяем список и создаем регистр события. вот код. к сожалению, это не сработало. второй метод не очень подходит, потому что конструктор селектора должен быть в классе объекта – Jack

Смежные вопросы