Vaadin PopupDateField没有删除

时间:2014-12-14 22:59:07

标签: java web-applications vaadin

我有一些自动生成的代码放置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();并且它被删除了,实际发生的是它删除了它看起来的对象,但我仍然得到一个挥之不去的日历图标,你可以点击并选择日期,但显示日期的文本字段不存在 - 非常奇怪.. < / p>

我发现通过删除mainLayout的父级修复它,所以从它的祖父母中删除日历的父级修复了问题,但这很奇怪。

有谁知道为什么会这样,或者是解决这个问题的更好方法

1 个答案:

答案 0 :(得分:0)

示例App

我不知道你问题的确切性质。但这是一个单文件完整示例,显示了从布局中重复添加和删除的PopupDateField。

enter image description here

enter image description here

关键命令是:

this.layout.removeComponent( this.popupDateField );

this.layout.addComponent( this.popupDateField );

源代码

以下是在Mac OS X Mountain Lion上使用Java 8中的Vaadin 7.3.6的完整单文件示例应用程序。此应用几乎不会从Vaadin Plugin for NetBeans 8版本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() );
        }

    }

}