2012-12-31 182 views
0

是否可以使用2個按鈕創建水平面板,其中一個位於GWT,另一個位於JavaScript我可以在GWT按鈕旁邊放一個JavaScript按鈕嗎?

例如,我有這樣的對象:

HorizontalPanel panelHeader = new HorizontalPanel(); 

Button buttonexample = new Button(); 

現在,我已經創建了一個.js文件與按鈕:

function javascriptbutton(){ 
    document.write('<input type="button" name="try" value="try">'); 
} 

並創建了一個jsni方法調用

public native static void javascriptTest() /*-{ 
    $wnd.javascriptbutton(); // JSNI 
}-*/; 

我的問題是:如何添加jsni方法t帽子在水平面板上包含一個按鈕?通常對於GWT,我做的是panelheadr.add(button),但是我怎樣才能做到這一點javascript按鈕?

+0

爲什麼?我只是好奇真實世界的場景是否適合這個服務。 – SSR

+0

我的場景是將一些舊的JavaScript GUI集成到一個新的GWT GUI中 – v3ctor

+1

Headsup!如此低的整合水平將成爲頭痛。它可以導入一個奇怪的小部件,如顏色選擇器或日期選擇器,但可能無法在js和gwt按鈕的級別混合匹配! – SSR

回答

0

您必須將JS與HTML分開。

在GWT中創建兩個按鈕。爲需要外部JavaScript的按鈕分配一個ID。附加一個單擊處理程序到你的按鈕,這個點擊處理程序調用本機JS:

myButton.getElement().setId("jsButton"); 
myButton.addClickHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 
     // Here you call your JSNI native method 
     javascriptTest(); 
    } 

}); 

在您的本地JS方法,你可以通過它的id引用此按鈕。

0

在javascript中創建像Button這樣的簡單小部件,並在GWT中使用應該是最後的手段和棘手的問題,因爲它可能會導致跨瀏覽器兼容性問題。此外,如果您必須調試該代碼,則會很困難。無論如何,有一個更好的解決方案。

您的自定義按鈕應該是GWT控件,以便將其添加到佈局容器。這意味着按鈕類應該至少實現IsWidget這允許按鈕將被添加的佈局容器調用asWidget方法並返回一個簡單的按鈕包裝容器,允許您輕鬆佈局按鈕。以下示例使用SimplePanel作爲包裝。

public class MyTextButton implements IsWidget, HasClickHandlers 
{ 
    private SimplePanel panel = new SimplePanel(); 
    private Button button; 
    public MyTextButton() 
    { 
     button = Button.create(panel.getElement()); 
    } 

    @Override 
    public Widget asWidget() 
    { 
     return panel; 
    } 
    //Use JavaScriptObject to create the DOM element for button which resides in the SimplePanel 
    private static class Button extends JavaScriptObject 
    { 
     private static native Button create(Element parent)/*-{ 
      //create your javascript button here using parent element as the wrapper. 
      //ex: if your function is correct 
      //$wnd.javascriptbutton(parent); 
     }-*/; 
    } 

    @Override 
    public void fireEvent(GwtEvent<?> event) 
    { 
    } 

    @Override 
    public HandlerRegistration addClickHandler(ClickHandler handler) 
    { 
     //bind this handler to native button's onClick, return the registration for removal, on remove you need to reset the onClick 
     return null; 
    } 
} 

但理想的MyTextButton類可以通過UIObject或任何其他特定類,如果你想獲得內置功能進行擴展。

相關問題