0

私は GWT が初めてで、ビューの実装に問題があります... MVP と SmartGWT を使用しています。MVP を解決する方法とその奇妙な点を定義することで、これを公開します。

私の onModule では、UIbinder でビルドされたクラスを定義します。LayoutPanel を宣言し、クラスのコンストラクターでこのように設定しました。

layoutPanel = binder.createAndBindUi(this);

このクラスにコンテナがあります:

public void setBodyLayout() {
panel.setWidgetLeftWidth(menuPanel, xx, PCT, xxx, PCT);
panel.setWidgetRightWidth(bodyPanel, xx, PCT, xx, PCT);
}

menuPanel と bodyPanel はどちらも上記のクラスで宣言された simplePanel です (UIfield は UIbinder で使用されます)。LayoutPanelにあります。私のActivityMapperのメソッド表示には、このメソッドがあります(実際には、メニューとボディ用に、以下のような2つのメソッドと2つのコンテナの2つのActivityMappersがあります)

public AcceptsOneWidget getBodyContainer() {
return new AcceptsOneWidget() {
  @Override
  public void setWidget(IsWidget w) {
    Widget widget = Widget.asWidgetOrNull(w);
    bodyPanel.setWidget(widget);
  }
};}

onModule に戻り、ActivityMapper を次のように宣言しました

BodyActivityMapper bodyContainerActivityMapper = new BodyActivityMapper(clientFactory);
ActivityManager bodyContainerActivityManager = new ActivityManager(bodyContainerActivityMapper, eventBus);
bodyContainerActivityManager.setDisplay(my_class_described_above.getBodyContainer());

同じ作業が MenuActivityMapper で行われました...

ついに

RootLayoutPanel.get().add(my_class_described_above.getLayoutPanel());

getLayoutPanel() が、上で宣言したクラスで宣言された私の layoutPanel を返すとき。

したがって、各リージョンには独自の ActivityMapper.ActivityMapper があり、メニューの ActivityMapper には 1 つのアクティビティしかなく、「ActivityMapperBody」にはメニューによってトリガーされるいくつかのアクティビティがあります。

コンテナのユーティリティは、さまざまな「アクション」のレイアウトを解決することです。アクティビティで開始されたビューを受け取るために、ゾーンを定義しました。

しかし、この構成はUIbinderで構築されたビューでのみ機能します...各ビューで、レイアウトを宣言し、次のように返します

public Widget asWidget() {
  return my_layout_declared;
 } 

レイアウトを返すと、何も機能しません。理由はよくわかりませんが、smartgwt の場合はさらに悪いと思います。必要なのは、レイアウトを取得してコンテナーに配置することだけです... smartgwt を使用すると、多くの時間を節約できます...

誰でも理解できるように、問題をより詳細に説明しました。そして、あなたの投稿が私に役立つかどうか、Chris Lercher に尋ねてください。

読んでくれてありがとう

4

1 に答える 1

0

Smart GWT FAQには解決策が記載されています。

Smart GWT インターフェースを GWT コンテナー内に絶対に配置する必要があり、コンテナーをいっぱいにしたい場合、最良の方法は、ウィンドウ レベルのサイズ変更イベントをリッスンし、最終的に最上位で resizeTo() を呼び出す独自のレイアウト計算を実行することです。スマート GWT ウィジェット。

しかし、そう言うのは間違っている

...GWT コンテナーは、サイズ変更時にイベントを発生 [しません]

レイアウト パネル(2009 年 12 月 8 日にリリースされた GWT 2.0 以降の「新しい」パネル) は、実際にそうします (ProvidesResize および RequiresResize インターフェースを参照)。そのため、MVP ボディ コンテナーのようなパネルがある場合 (およびその親が最上位の RootLayoutPanel までの LayoutPanel である場合) はonResize()、ウィンドウのサイズ変更イベントをリッスンする代わりに、ボディ コンテナーのメソッドをオーバーライドすることもできます。

では、具体的な問題をどのように解決できますか?

resizeTo(width, height)最上位の Smart GWT レイアウトを呼び出す必要があります

  • (新しい) Smart GWT レイアウトを配置する場合、たとえば、場所が変更されたときに新しいレイアウトを配置する場合があります。
  • ウィンドウのサイズが変更されたとき、またはコンテナーのサイズを変更するその他のことが発生したとき (または、レイアウト パネルを使用している場合は、その onResize() を使用できます)

呼び出しではresizeTo(width, height)、周囲のコンテナに問い合わせて、幅と高さを決定する必要があります。

container.getElement().getClientWidth()
于 2013-09-17T18:52:30.947 に答える