Java 未删除Vaadin PopupDateField

Java 未删除Vaadin PopupDateField,java,web-applications,vaadin,Java,Web Applications,Vaadin,我有一些自动生成的代码放置PopupDateField startonefield = new PopupDateField(); startonefield.setCaption("Starts on"); startonefield.setImmediate(false); startonefield.setWidth("-1px"); startonefield.setHeight("-1px"); mainLayout.addCompone

我有一些自动生成的代码放置PopupDateField

    startonefield = new PopupDateField();
    startonefield.setCaption("Starts on");
    startonefield.setImmediate(false);
    startonefield.setWidth("-1px");
    startonefield.setHeight("-1px");
    mainLayout.addComponent(startonefield, "top:60.0%;left:5.0%;");
这是我试图删除日期字段的所有内容

    startonefield.setVisible(false);
    this.startonefield.setIcon(null);
    this.startonefield=null;    
    this.mainLayout.removeComponent(startonefield);
    this.mainLayout.removeAllComponents();
所以我应该调用mainLayout.removeAllComponents;它被删除了,实际发生的是它删除了看起来的对象,但我仍然得到一个挥之不去的日历图标,你可以点击并选择日期,但是显示日期的文本字段不在那里-非常奇怪

我发现,通过将mainLayout从其父级移除,可以修复它,因此将日历的父级从其父级移除可以修复问题,但这很奇怪

有人知道为什么会发生这种情况,或者知道解决此问题的更好方法吗 我不知道你问题的确切性质。但这里有一个完整的示例,显示了一个PopupDateField在布局中被反复添加和删除

关键命令包括:

this.layout.removeComponent( this.popupDateField );

源代码 以下是在Mac OS X Mountain Lion上使用Java 8中的Vaadin 7.3.6的完整单文件示例应用程序。此应用程序仅从由1.1.2版创建的应用程序进行了修改

在实际工作中,我会将布局分离到它自己的类文件中。但是为了演示的目的,我将只使用一个文件应用程序

package com.example.bogusvaadinapp;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import java.time.ZonedDateTime;
import javax.servlet.annotation.WebServlet;

@Theme ( "mytheme" )
@SuppressWarnings ( "serial" )
public class MyVaadinUI extends UI
{

    final VerticalLayout layout = new VerticalLayout();
    final Label label = new Label( "PopupDateField is removed." );
    final PopupDateField popupDateField = new PopupDateField( "SomePopup:" );

    @WebServlet ( value = "/*" , asyncSupported = true )
    @VaadinServletConfiguration ( productionMode = false , ui = MyVaadinUI.class , widgetset = "com.example.bogusvaadinapp.AppWidgetSet" )
    public static class Servlet extends VaadinServlet
    {
    }

    @Override
    protected void init ( VaadinRequest request )
    {
        this.layout.setMargin( true );
        setContent( this.layout );

        Button button = new Button( "Click Me" );
        button.addClickListener( new Button.ClickListener()
        {
            public void buttonClick ( ClickEvent event )
            {
                reactToButtonClick();
            }
        } );
        this.layout.addComponent( button );
        this.layout.addComponent( this.label );
    }

    void reactToButtonClick ()
    {
        // Determine if layout contains our widget.
        Boolean layoutHasPopup = Boolean.FALSE;
        java.util.Iterator<Component> iter = this.layout.iterator();
        while ( iter.hasNext() ) {
            if ( iter.next().equals( this.popupDateField ) ) {
                layoutHasPopup = Boolean.TRUE;
                break;
            }
        }
        // Add/Remove widget.
        if ( layoutHasPopup ) {
            // Remove widget.
            this.layout.removeComponent( this.popupDateField );
            this.label.setValue( "PopupDateField gone." );
        } else { // Else layout does not have widget.
            // Add widget.
            this.layout.addComponent( this.popupDateField );
            this.label.setValue( "Showing PopupDateField at " + ZonedDateTime.now() );
        }

    }

}

您使用哪种版本的Vaadin?
package com.example.bogusvaadinapp;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Component;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import java.time.ZonedDateTime;
import javax.servlet.annotation.WebServlet;

@Theme ( "mytheme" )
@SuppressWarnings ( "serial" )
public class MyVaadinUI extends UI
{

    final VerticalLayout layout = new VerticalLayout();
    final Label label = new Label( "PopupDateField is removed." );
    final PopupDateField popupDateField = new PopupDateField( "SomePopup:" );

    @WebServlet ( value = "/*" , asyncSupported = true )
    @VaadinServletConfiguration ( productionMode = false , ui = MyVaadinUI.class , widgetset = "com.example.bogusvaadinapp.AppWidgetSet" )
    public static class Servlet extends VaadinServlet
    {
    }

    @Override
    protected void init ( VaadinRequest request )
    {
        this.layout.setMargin( true );
        setContent( this.layout );

        Button button = new Button( "Click Me" );
        button.addClickListener( new Button.ClickListener()
        {
            public void buttonClick ( ClickEvent event )
            {
                reactToButtonClick();
            }
        } );
        this.layout.addComponent( button );
        this.layout.addComponent( this.label );
    }

    void reactToButtonClick ()
    {
        // Determine if layout contains our widget.
        Boolean layoutHasPopup = Boolean.FALSE;
        java.util.Iterator<Component> iter = this.layout.iterator();
        while ( iter.hasNext() ) {
            if ( iter.next().equals( this.popupDateField ) ) {
                layoutHasPopup = Boolean.TRUE;
                break;
            }
        }
        // Add/Remove widget.
        if ( layoutHasPopup ) {
            // Remove widget.
            this.layout.removeComponent( this.popupDateField );
            this.label.setValue( "PopupDateField gone." );
        } else { // Else layout does not have widget.
            // Add widget.
            this.layout.addComponent( this.popupDateField );
            this.label.setValue( "Showing PopupDateField at " + ZonedDateTime.now() );
        }

    }

}