0

Google Gears も使用する Google Web Toolkit (GWT) アプリケーションを作成しようとしていますが、パネルを削除しようとするたびに例外が発生し、パネルがそこに残ります。

これは、私が取得した例外からの抜粋です (コールスタックの関連ビットのみを含めました。残りは、以下の含まれる関数に降りてきます):

java.lang.AssertionError: A widget that has an existing parent widget may not be added to the detach list
    at com.google.gwt.user.client.ui.RootPanel.detachOnWindowClose(RootPanel.java:122)
    at com.google.gwt.user.client.ui.RootPanel.get(RootPanel.java:197) 

何が問題なのかはわかりませんが、Gears の使用が承認された後、ボタンをそのままにしておくのは本当に好きではありません。

私は何を間違っていますか?または、これを機能させるためにこれを行うことができる別の方法に関する提案はありますか?

if(!gearsFactory.hasPermission()) {
    HorizontalPanel rightPanel = new HorizontalPanel();
    rightPanel.getElement().setId("gearsPrompt");
    rightPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE);
    rightPanel.setSpacing(0);
    rightPanel.setHeight("28px");

    InlineLabel enableGearsText = new InlineLabel("Enable Gears for off-line access");
    enableGearsText.getElement().setId("gearsText");
    enableGearsText.addStyleName("titleElement");
    rightPanel.add(enableGearsText);

    final Button gearsButton = new Button("Use Gears");
    gearsButton.getElement().setId("gearsButton");
    gearsButton.addStyleName("titleElement");
    gearsButton.setHeight("24px");

    gearsButton.addClickHandler( new ClickHandler() {
        public void onClick(ClickEvent event) {
            Factory gearsFactory = Factory.getInstance();
            if(gearsFactory != null) {
                if(gearsFactory.getPermission()) {
                    RootPanel gearsPrompt = RootPanel.get("gearsPrompt");
                    gearsPrompt.removeFromParent();
                }
            }
        }
    });

    rightPanel.add(gearsButton);

    RootPanel titleBarRight = RootPanel.get("titleBarRight");
    titleBarRight.add(rightPanel);
}
4

4 に答える 4

1

これが古いことは知っていますが、どうですか...

gearsButton.addClickHandler( new ClickHandler() {
            public void onClick(ClickEvent event) {
                    Factory gearsFactory = Factory.getInstance();
                    if(gearsFactory != null) {
                            if(gearsFactory.getPermission()) {
                                   Button btn=(Button) event.getSource();
                                   btn.removeFromParent();
                            }
                    }
            }
    });
于 2011-09-04T03:59:43.753 に答える
1

私が見つけた 1 つの解決策は、「titleBarRight」パネルの下にあるすべてのウィジェットをループして、そこに含まれるすべてのウィジェットを削除することです。

if(gearsFactory.getPermission()) {
    RootPanel titleBarRight = RootPanel.get("titleBarRight");
    java.util.Iterator<Widget> itr = titleBarRight.iterator();
    while(itr.hasNext()) {
        itr.next();
        itr.remove();
    }
}

しかし、どういうわけか、これはまだハックであり、「正しい方法」とは言えません。

于 2009-06-07T22:50:51.957 に答える
0

できるよ :

theParentWidget.remove(index);

最初の子は 0 に対応します。

于 2010-06-11T14:13:07.130 に答える
0

RootPanel.get("gearsPrompt").removeFromParent();自分の代わりに使用する理由はありますrightPanel.removeFromParent();か? 参照はすでにそこにあります。

于 2009-06-07T23:01:31.373 に答える