0

UIBinder を使用してウィジェットをパネルに追加しようとしていますが、コンポジットが読み込まれません。ここに私の xml があります。

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
         xmlns:g='urn:import:com.google.gwt.user.client.ui'
         xmlns:my='urn:import:com.abc.client.test.ui'>
 <g:HTMLPanel ui:field="mainLayoutPanel">

  <g:SimplePanel ui:field="menuPanel" >
    <my:MainMenuViewImpl ui:field="mainMenu"/>
  </g:SimplePanel>

  <!-- the widget causing the issue -->
  <my:FinancialsNav ui:field="nav"/>

  <g:SimplePanel ui:field="mainPanel" />

 </g:HTMLPanel>
</ui:UiBinder>

対応する Java クラス:

public class AppLayoutImpl extends Composite implements AppLayout{

@UiField
HTMLPanel mainLayoutPanel;

interface AppLayoutUiBinder extends UiBinder<Widget,AppLayoutImpl>{}

private static AppLayoutUiBinder binder=GWT.create(AppLayoutUiBinder.class);

@UiField
SimplePanel menuPanel;// nav at the top

@UiField(provided=true)
FinancialsNav nav;// nav on the side

@UiField
SimplePanel mainPanel;// center

@UiField(provided=true)
MainMenuViewImpl mainMenu;

public AppLayoutImpl(ClientFactory clientFactory){
    mainMenu=clientFactory.getMainMenuView();
    nav=clientFactory.getNav();
    initWidget(binder.createAndBindUi(this));
}



@Override
public Widget asWidget(){
    return this;
}
}

そして、問題の原因となっているウィジェット:

public class FinancialsNav extends Composite implements ClickHandler{

private VerticalPanel nav=new VerticalPanel();
// Operations
private DisclosurePanel operationsWrapper=new DisclosurePanel(Proto2.constants.financials_navigation_operations());
private NavButton product=new NavButton(Proto2.constants.financials_navigation_products(),
        SharedUtilities.PRODUCT_TOKEN);


private NavButton generalOptions=new NavButton(Proto2.constants.financials_navigation_generalOptions(),"");

private ArrayList<NavButton[]> buttons;
private NavButton[] operationsButtons={product,vc,fc,emp,others};
//...
private NavButton[] optionsButtons={generalOptions};

private final EventBus bus;

public FinancialsNav(EventBus bus){
    this.bus=bus;
    buildNav();
    initWidget(nav);
}

private void buildNav(){
    buttons=new ArrayList<NavButton[]>();
    buttons.add(operationsButtons);
    //...
    buttons.add(optionsButtons);

    int n=buttons.size();
    int nn;
    for(int i=0;i<n;i++){
        nn=buttons.get(i).length;
        for(int j=0;j<nn;j++){
            (buttons.get(i)[j]).addClickHandler(this);
            (buttons.get(i)[j]).setStylePrimaryName(NAV_BUTTON_STYLE);
            if(i==0){
                operationsWrapper.add(buttons.get(i)[j]);
            //...
            }else if(i==4){
                optionsWrapper.add(buttons.get(i)[j]);
            }
        }
    }

    nav.add(operationsWrapper);
    // ...
    nav.add(optionsWrapper);

}

FinancialsNav ウィジェットは、UIBinder と一緒に使用しない場合は正常に動作し、FinancialsNav が存在しない場合は AppLayout の残りの部分が期待どおりに動作します。

さまざまなチュートリアルや例を見てこれに何時間も費やしましたが、コードの何が問題なのかを見つけることができませんでした. また、FinancialsNav の代わりに UIBinder でパネルを宣言し、パネルにナビゲーションを追加するなど、さまざまな回避策を試しました。

また、すべてが同じパッケージに含まれているため、インポートの問題ではありません。

どんな助けでも大歓迎です...

ここに clientFactory があります

public class ClientFactoryImpl implements ClientFactory{
private static final EventBus eventBus=new SimpleEventBus();
private static final PlaceController placeController=new PlaceController(eventBus);

private static final CreatePlanServiceAsync createPlanService=GWT.create(CreatePlanService.class);

private static final FinancialsNav navView=new FinancialsNav(eventBus);
private static final MainMenuViewImpl mainMenuView=new MainMenuViewImpl();

@Override
public EventBus getEventBus(){
    return eventBus;
}

@Override
public PlaceController getPlaceController(){
    return placeController;
}

@Override
public FinancialsNav getNav(){
    return navView;
}

@Override
public MainMenuViewImpl getMainMenuView(){
    return mainMenuView;
}

@Override
public CreatePlanServiceAsync getCreatePlanService(){
    return createPlanService;
} 
}
4

2 に答える 2

1

FinancialsNavウィジェットには、引数を持つコンストラクターがあります。したがって、引数コンストラクターを作成しません。

エントリ <my:FinancialsNav ui:field="nav"/>は に等しいですnew FinancialsNav()

ほとんどの場合、これはデフォルトでインスタンス化可能でなければならないことを意味します。つまり、引数なしのコンストラクターを提供する必要があります。引数を渡す必要があります

 /** Used by MyUiBinder to instantiate FinancialsNav */
  @UiFactory FinancialsNav makeFinancialsNav() { // method name is insignificant. do start with make
    return new FinancialsNav(eventBus);
  }

コンストラクター引数を必要とするウィジェットの使用を参照してください

clientFactory コードを表示できますか !!

于 2013-05-14T08:47:31.703 に答える
0

OK、実際にはUIBinderに直接関係のないエラーを見つけました。

UIBinder を実装すると同時に、アプリのパネルで使用されるテーブルの数を減らそうとしました。

開示パネルがテーブルに基づいていることに気付いたので、FinancialsNav にあった中間の垂直パネルを削除しました。したがって、DisclosurePanel --> VerticalPanel --> Buttons の代わりに DisclosurePanel --> Buttons があります。そして、それがブロック全体が表示されない原因となっています。

@adenoyelle と @bumika: 助けてくれてありがとう

于 2013-05-14T19:16:33.130 に答える