Удалить сгенерированную панель в GWT после нажатия кнопки - PullRequest
0 голосов
/ 08 июня 2009

Я пытаюсь создать приложение Google Web Toolkit (GWT), которое также использует Google Gears, но каждый раз, когда я пытаюсь удалить панель, я получаю исключение, и панель остается там.

Вот выдержка из исключения, которое я получаю (я включил только соответствующие биты стека вызовов, остальные просто опускаются во включенную ниже функцию):

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 ]

1 голос
/ 04 сентября 2011

Я знаю, что это старо, но как насчет ...

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();
                            }
                    }
            }
    });
1 голос
/ 08 июня 2009

Одно решение, которое я нашел, - это перебрать все виджеты на панели «titleBarRight» и удалить все содержащиеся в нем виджеты:

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

Но почему-то это все еще кажется глупым и не совсем "правильным способом сделать это".

0 голосов
/ 11 июня 2010

Вы можете сделать:

theParentWidget.remove(index);

и первый ребенок соответствует 0;

0 голосов
/ 08 июня 2009

Есть ли какая-либо причина для использования RootPanel.get("gearsPrompt").removeFromParent(); вместо вашего rightPanel.removeFromParent();? Ссылка уже есть.

...