【问题标题】:GWT: How do I get a reference to a button from the RootPanel?GWT:如何从 RootPanel 获取对按钮的引用?
【发布时间】:2011-10-26 16:50:33
【问题描述】:

我正在使用 GWT 2.4。在我的 onModuleLoad 方法中,给定一个字符串 id,我如何从 RootPanel 对象获取对页面上现有按钮的引用?我正在尝试这个

public void onModuleLoad() {
    ...
    final Button submitButton = (Button) RootPanel.get("submit");

但出现编译错误“无法从 RootPanel 转换为 Button”。

编辑:

我认为使用迭代器可以治愈痛苦,但没有骰子。这是加载的默认 HTML(注意带有 id="submit" 的按钮)...

<div>

    <form name="f">

        File name: <input type="text" size="25" id="filename" name="filename"

            value="" /> <input type="button" id="submit" name="submit"

            value="Submit" /> <input type="hidden" name="curId" id="curId"

            value="" />

    </form>

</div>

<div id="content"></div>

但是 onModuleLoad 中的这段代码会导致 NullPointerException(因为找不到 submitButton id)...

public void onModuleLoad() {

    final Button submitButton = (Button) getWidgetById("submit");
    submitButton.addStyleName("submitButton");
    ...

private Widget getWidgetById(final String id) {
    Widget eltToFind = null;
    final Iterator<Widget> iter = RootPanel.get().iterator();
    while (iter.hasNext()) {
        final Widget widget = iter.next();
        final Element elt = widget.getElement();
        if (elt.getId() != null && elt.getId().equals(id)) {
            eltToFind = widget;
            break;
        } // if
    } // while
    return eltToFind;
}

谢谢,- 戴夫

【问题讨论】:

    标签: gwt


    【解决方案1】:

    您可以使用Document.get().getElementById("submit").&lt;InputElement&gt;cast() 获取输入元素,但无法从中获取Button 小部件。

    如果您将代码更改为 &lt;button type="button" id="submit" name="submit" value="Submit"&gt; 而不是 &lt;input&gt;(从技术上讲,不需要 type=button 部分,但如果您不这样做,某些浏览器会将其视为 type=submit),那么您可以使用Button.wrap():

    Button button = Button.wrap(Document.get().getElementById("submit"));
    

    【讨论】:

      【解决方案2】:

      一些 GWT 小部件具有静态方法 wrap(),它允许将 DOM 元素转换为小部件实例。

      按钮提交 = Button.wrap(DOM.getElementById("submit"));

      【讨论】:

        【解决方案3】:

        get() 方法返回与浏览器元素关联的 RootPanel,而不是具有该名称的小部件。 RootPanel 是 ComplexPanel 的子类,因此我认为最好的办法是使用 ComplexPanel 中的方法来遍历小部件,然后以这种方式找到您想要的小部件。

        【讨论】:

        • 你能演示一下如何做到这一点吗?我已经尝试过迭代器方法(在我的编辑中),但它没有找到 id 肯定在页面上的元素。
        【解决方案4】:

        Wrap 创建一个层,并将删除之前在该按钮上编写的所有功能。

        我使用下面的代码来解决这个问题。

        Document.get().getElementById("buttonId").getStyle().setDisplay(false)
        

        【讨论】:

          猜你喜欢
          • 2013-03-10
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          相关资源
          最近更新 更多