2012-10-19 205 views
1

我在使用GWT的項目中遇到ClickHandler問題。Clickhandler不會觸發

在對話框的標題中,我想插入一個新按鈕。

  1. 我創建了一個新的插入方法:addToTitle(...)
  2. 我加ClickHandler到按鈕

問題:通過點擊按鈕不會觸發事件。爲什麼?

這是我的代碼:

DialogBox dialog = new DialogBox(); 

Button button = new Button("A new Button"); 

     button.addClickHandler(new ClickHandler() 
     { 
      @Override 
      public void onClick(ClickEvent event) 
      { 
       Window.alert("yuhuhuhu"); 

      } 
     }); 

dialog.addToTitle(button); 

代碼(從評論部分提取的):

public class PlentyDialogWindow extends DialogBox { 
    private FlowPanel captionPanel = new FlowPanel(); 
    public Widget closeWidget = null; 
    private boolean closeOnEscKey = false; 
    private FlowPanel titleContentWrapper = new FlowPanel(); 
    public PlentyDialogWindow(boolean isModal) { 
     super(false, isModal); 
     this.addStyleName("DialogBox"); 
     this.getElement().setId("DialogBoxId"); 
     this.setAnimationEnabled(true); 
     this.closeWidget = generateCloseButton(); 
    } 

    public void setCaption(String txt,Widget w) { 
     captionPanel.setWidth("100%"); 
     this.addCaption(txt); 
     this.titleContentWrapper.getElement().getStyle().setDisplay(Display.INLINE_BLOCK); 
     captionPanel.add(this.titleContentWrapper); 
     FlowPanel widgetWrapper = new FlowPanel(); 
     widgetWrapper.add(w); 
     widgetWrapper.addStyleName("PlentyPopupCloseIconWrapper"); 
     captionPanel.add(widgetWrapper); 
     captionPanel.addStyleName("Caption"); 
     Element td = getCellElement(0,1); 
     td.setInnerHTML(""); 
     td.appendChild(captionPanel.getElement()); 
    } 

    /** * * @param w */ public void addToTitle(Widget w) { 
     this.titleContentWrapper.add(w); 
    } 
} 
+2

稱爲試試我敢肯定的Bug是addToTitle()內。請顯示該代碼。 –

+0

歡迎來到Stackoverflow。 「addToTitle(...)'函數是否可以將添加到HTML字符串的小部件轉換(從而消除了GWT維護對處理程序引用的機會)?我們確實需要看到你的'DialogBox'類來提供幫助。乾杯, –

+0

感謝您的回答! addToTitle(...) - 函數僅將新小部件插入到標題od對話框中。 public void addToTitle(Widget w) \t { \t \t this.titleContentWrapper.add(w); \t } 而dialogBox是一類GWT。 – user1758855

回答

0

的解決方案是有點麻煩。

public class PlentyDialogWindow extends DialogBox { 

    /* 
    * Create custom inner class extending `FlowPanel`. You need it only 
    * to make `onAttach` and `onDetach` methods be visible to wrapping 
    * class (e.g. your `PlentyDialogWindow` class). 
    */ 
    static class MyCaptionPanel extends FlowPanel { 

     @Override 
     protected void onAttach() { 
      super.onAttach(); 
     } 

     @Override 
     protected void onDetach() { 
      super.onDetach(); 
     } 
    } 

    /* 
    * `PlentyDialogWindow`'s field `captionPanel` will be an instance of 
    * this class. 
    */ 
    private MyCaptionPanel captionPanel = new MyCaptionPanel(); 


    /* 
    * ... leave the rest of your class untouched ... 
    */ 


    /* 
    * Finally, overwrite `PlentyDialogWindow`'s `onAttach` and `onDetach` 
    * methods to invoke `captionPanel`'s corresponding methods: 
    */ 
    @Override 
    protected void onAttach() { 
     super.onAttach(); 
     captionPanel.onAttach(); 
    } 

    @Override 
    protected void onDetach() { 
     super.onDetach(); 
     captionPanel.onDetach(); 
    } 
} 

就是這樣。

0

如果你的唯一的問題是clickHandler事件沒有被使用addDOMHandler代替addClickHandler

yourWidget.addDomHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 


    } 
},ClickEvent.getType());