0

ウィジェットを別のコンテナ クラスの RootPanel に追加するときに問題が発生します。ウィジェットの作成中に行う非同期呼び出しに関連している可能性があると思います。EntryPoint を実装するImageViewという名前のメイン クラスがあります。このクラスでは、ボタンをクリックしてNewWidgetという名前のウィジェットのインスタンスを作成しています。ただし、従来の方法では表示できません。

EntryPointクラス ( ImageView )は次のとおりです。

import com.mycompany.project.client.widgets.NewWidget;
public class ImageViewer implements EntryPoint {

public void onModuleLoad() {

    Button b = new Button("Button");
    RootPanel.get().add(b);

    b.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            NewWidget w = new NewWidget();
            RootPanel.get().add(w);
        }
    });
}

そして、ここに私のウィジェット(NewWidget)があります:

public class NewWidget extends Composite {

     final static DataServiceAsync service = (DataServiceAsync) GWT.create(DataService.class);

     final FlowPanel mainPanel = new FlowPanel();

     public NewWidget() {
         fillImagePath();
     }

     public void fillImagePath(){
     ServiceDefTarget endpoint = (ServiceDefTarget) service;
     endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "data");
         service.getAllDocuments(new AsyncCallback<ArrayList<String>>() {
             @Override
             public void onFailure(Throwable e) {
                 Window.alert("Server call failed.");
             }
             @Override
             public void onSuccess(ArrayList<String> paths) {
                 process(paths);
             }
         });
     }

     public void process(ArrayList<String> paths){
         ArrayList<String> imagePath = paths;
         Image img = new Image(imagePath.get(4));
         mainPanel.add(img);
         initWidget(mainPanel);
     }
}

このNewWidgetでは、10 個の異なる画像 (つまり、"images/01.jpg"、"images/02 .jpg" など)。私は、これらの画像パスを正しく正しく受け取ることができると確信しています。NewWidgetに表示するインデックス番号 4 を任意に選択しました。

問題は、このNewWidgetImageViewメイン パネルに表示できないことです。この方法で他のウィジェットを簡単に表示できます。いろいろ試した結果、 NewWidgetRootPanel.get().add(mainPanel)の最後に一行追加すれば画像を表示できることがわかりました。ただし、親コンテナー ( ImageViewの RootPanel ) を参照する呼び出しを行いたくありません。他のウィジェットを表示できるように、コンテナー パネルでインスタンス化するだけでこの画像を表示できないのはなぜですか? ウィジェットを追加しようとする前に非同期呼び出しが完了しないことに関連していると確信しています。しかし、これを修正する方法がわかりません。

人々が自分の考えを共有してくれたら、とてもうれしいです。ありがとう。

4

1 に答える 1

1

initWidget(mainPanel)呼び出しをコンストラクターの最初の行に移動します。

于 2011-04-26T22:19:13.477 に答える