我有一些自动生成的代码放置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的父级修复它,所以从它的祖父母中删除日历的父级修复了问题,但这很奇怪。
有谁知道为什么会这样,或者是解决这个问题的更好方法
答案 0 :(得分:0)
我不知道你问题的确切性质。但这是一个单文件完整示例,显示了从布局中重复添加和删除的PopupDateField。
关键命令是:
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() );
}
}
}