2016-07-07 13 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 { 
    } 
} 

そして私は、私は、その後失敗し、UIに追加しようとする様々なフィールドを保持している別のクラスがあります。だから、

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(コンポーネントを...)型AbstractComponentContainer中のため適用されません引数(Label、Calculation) " 別のクラスのオブジェクトを作成してレイアウトに追加するのと同じように、前と同じようなことをやったことがありますが、今回はうまくいきませんでした。私は間違っていたということです...どんな考えですか? ありがとう

答えて

1

メソッドaddComponents(...)は引数としてComponentを受け入れます。 あなたCalculationクラスは/拡張する独自のコンポーネントについてはComponent

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

+0

@antobboを実装していない、基本クラスCustomComponentがベストプラクティスです。 [docs](https://vaadin.com/docs/-/part/framework/components/components-customcomponent.html)を参照してください。 –

+0

'extends Component'を使用すると、それでも私はaddComponents()を使用する場所でエラーが発生しますが、' extends CustomComponent'を実行するとコンパイラがOKであると思われます。問題は、私のフィールドはまだ表示されません。だから、私はリンク@SteffenHarbichを見て、私は自分のコードにそれを適用しようとしました。私はスレッドのクラスをepdated – antobbo

+0

右、私はそれを考え出したように見えます。どうやら、 'layout.addComponents(title、calculation);のようにオブジェクトを追加するだけでは機能しませんが、' layout.addComponents(title、calculation.button、calculation.divisor、calculation)のようにオブジェクトのプロパティを指定する必要があります。 .dividend、calculation.result); '。私は少し奇妙だと思うが、私はレイアウトに直接オブジェクトを追加することができると思っていただろう – antobbo

関連する問題