Java 未删除Vaadin PopupDateField
我有一些自动生成的代码放置PopupDateFieldJava 未删除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
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() );
}
}
}