2016-07-07 21 views
0

Hallo, ich habe ein seltsames Problem, aber ich bin mir sicher, dass ich etwas Dummes mache. In einem Maven-Projekt, das ich meine UI-Klasse haben, wie unten:Komponente kann nicht zum Layout hinzugefügt werden

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 { 
    } 
} 

Und dann habe ich eine andere Klasse, die verschiedene Felder enthält, die ich auf der Benutzeroberfläche hinzufügen dann versuchen, ohne Erfolg:

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); 
    } 
} 

So meine Frage ist, wenn sie in der UI-Klasse-I

layout.addComponents(title, calculation); 

bekomme ich eine Fehlermeldung,: „die Methode addComponents (Component ...) in der Art AbstractComponentContainer ist nicht anwendbar für die Argumente (Label, Berechnung) " Ich habe schon einmal etwas Ähnliches gemacht, zum Beispiel ein Objekt einer separaten Klasse zu erstellen und es dem Layout hinzuzufügen und es hat funktioniert, diesmal nicht und ich bin mir nicht sicher, was es ist ist das ich falsch gemacht habe ... irgendeine Idee? danke

Antwort

1

Die Methode addComponents(...) akzeptiert nur Component als Argumente. Ihre Calculation Klasse erstreckt sich nicht/Arbeitsgeräte Component

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

+0

@antobbo für eigene Komponenten, ist die Basisklasse Custom Best Practice. Siehe [Dokumente] (https://vaadin.com/docs/-/part/framework/components/components-customcomponent.html). –

+0

Wenn ich 'extends Component' verwende, gibt es immer noch Beschwerden und gibt mir einen Fehler, wo ich addComponents() benutze, aber wenn ich 'extends CustomComponent' benutze, scheint es in Ordnung zu sein, in dem Sinne, dass der Compiler OK ist. Das Problem ist, meine Felder erscheinen immer noch nicht. Also, ich habe mir den Link @SteffenHarbich angesehen und ich habe versucht, das auf meinen Code anzuwenden. Ich habe die Klassen im Thread – antobbo

+0

richtig epdiert, sieht aus, als ob ich das herausgefunden habe. Anscheinend fügt das Objekt, wie in 'layout.addComponents (title, calculation);', nicht zu, aber ich muss die hinzuzufügende Eigenschaft angeben, wie 'layout.addcomponents (title, calculation.button, calculation.divisor, calculation .dividend, Berechnung.Ergebnis); '. Ich finde das ein wenig seltsam, aber ich hätte gedacht, ich könnte das Objekt direkt zum Layout hinzufügen. – antobbo