2016-07-07 68 views
0

大家好我有一個奇怪的問題,但我敢肯定我正在做一些愚蠢的事情。 在Maven項目我有我的UI類,如下:不能添加組件到佈局

package my.vaadin.project.exceptionTest; 
import javax.servlet.annotation.WebServlet; 
import com.vaadin.annotations.Theme; 
import com.vaadin.annotations.VaadinServletConfiguration; 
import com.vaadin.annotations.Widgetset; 
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.Label; 
import com.vaadin.ui.TextField; 
import com.vaadin.ui.UI; 
import com.vaadin.ui.VerticalLayout; 
@Theme("mytheme") 
@Widgetset("my.vaadin.project.exceptionTest.MyAppWidgetset") 
public class MyUI extends UI { 

    @Override 
    protected void init(VaadinRequest vaadinRequest) { 
     final VerticalLayout layout = new VerticalLayout(); 
     final Calculation calculation = new Calculation(); 
     final Label title = new Label("Calculation");  
     layout.addComponents(title, calculation);  
     layout.setMargin(true); 
     layout.setSpacing(true);   
     setContent(layout); 
    } 
    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true) 
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false) 
    public static class MyUIServlet extends VaadinServlet { 
    } 
} 

然後,我必須保持各領域,我再試圖添加到用戶界面,不成功另一個類:

package my.vaadin.project.exceptionTest; 
import java.awt.Component; 
import com.vaadin.ui.Button; 
import com.vaadin.ui.Button.ClickEvent; 
import com.vaadin.ui.CustomComponent; 
import com.vaadin.ui.TextField; 
import com.vaadin.ui.VerticalLayout; 
import com.vaadin.event.Action; 
public class Calculation extends CustomComponent{ 
    final VerticalLayout vl = new VerticalLayout(); 
    final TextField divisor = new TextField(); 
    final TextField dividend = new TextField(); 
    Button button = new Button("Click Me"); 
    public Calculation(){ 
     divisor.setCaption("Enter the divisor:"); 
     dividend.setCaption("Enter the dividend:"); 
     button.addClickListener(new Button.ClickListener(){ 
      @Override 
      public void buttonClick(ClickEvent event) { 
       System.out.println("this is a test");    
      }    
     });  
     vl.setMargin(true); 
     vl.setSpacing(true); 
     vl.addComponents(divisor, dividend, button); 
    } 
} 

所以我的問題是,當在UI類我做

layout.addComponents(title, calculation); 

我得到一個錯誤說:「該方法addComponents(Component等)的類型AbstractComponentContainer不適用參數(標籤,計算)「 我以前做過類似的事情,比如創建一個單獨的類的對象,並將其添加到佈局,它已經工作,這次它不,我不知道它是什麼是我做錯了......任何想法? 謝謝

回答

1

方法addComponents(...)只接受Component作爲參數。 您Calculation類不會擴展/實現Component

https://vaadin.com/api/com/vaadin/ui/AbstractComponentContainer.html#addComponents(com.vaadin.ui.Component...)

+0

@antobbo爲自己的組件,基類CustomComponent是最好的做法。請參閱[文檔](https://vaadin.com/docs/-/part/framework/components/components-customcomponent.html)。 –

+0

如果我使用'extends Component',它仍然抱怨並且在使用addComponents()的時候給了我一個錯誤,但是如果我改爲'擴展CustomComponent',它似乎就OK了,因爲編譯器可以。麻煩的是,我的領域仍然沒有出現。所以,我看了鏈接@SteffenHarbich,並試圖將其應用於我的代碼。我已經對線程 – antobbo

+0

中的類進行了處理,看起來像我想到的那樣。顯然只是添加'layout.addComponents(title,calculation)'中的對象''不起作用,但我必須指定要添加的對象的屬性,例如'layout.addComponents(title,calculation.button,calculation.divisor,calculation .dividend,calculation.result);'。我覺得這有點奇怪,但我一直以爲我可以直接將對象添加到佈局 – antobbo