0

私は一般的な問題に対するいくつかの可能な解決策を模索しています(あなたの入力を歓迎します)。わかりやすくするために、問題を単純化しました。

いくつかの長方形のボックスを表示するウィジェットがあるとしましょう。各ボックスの静的幅と高さは同じです。1000を超えるボックスがたくさんあり、この数は時間の経過とともに増加します。

ボックスを表示するためにページ付けを使用することを考えています。スクロールバーの使用は避けたいです。そこで、ページのサイズに基づいて、各ページに表示されるボックスの数を動的に変更したいと思います。

この問題を解決するための最良の方法は何ですか。最初は、container-widgetが実装されていれば、RequiresResize ウィジェットのサイズをキャプチャできるはずだと思いました。RequiresResizeただし、とを実装するには、すべての親ウィジェットが必要だと思いますProvidesResize

もっと良い方法はありますか?

ありがとう

4

3 に答える 3

2

バニラGWTプロジェクト内でこれを取得するための最も簡単な方法は、レイアウトパネルクラスを使用することです。これらは、前述のRequiresResizeProvidesResizeインターフェイスを使用します。これを開始するための最良の方法は、RootPanelではなく、を使用することRootLayoutPanelです。この代替の開始点は、単一のRootPanelインスタンスをラップし、存在する場合は呼び出すことによって、その子を使用可能なブラウザースペースに合わせてサイズ設定しRequiresResize.onResizeます。

ウィジェットツリーの残りの部分(親に追加された子など)も、これらのインターフェイスを使用して、サイズ変更情報が必要であることを宣言する必要があります。実際にはそうでないウィジェットを作成することはない可能性が非常に高いですが、ほとんどの場合、既存のウィジェット(UiBinderまたはCompositeを使用)を新しいウィジェットにラップします-新しいウィジェットを作成するというトリックがあります。ProvidesResizeまたはを実装しないデフォルトのものRequiresResize。アプリを構築する際の2つの基本的な解決策:

  • これらの2つのインターフェイスを実装します。次に、メソッドで、サイズが変更されたことを知る必要がある最上位ウィジェットをonResize()呼び出します。onResize()これにより、より詳細な制御が可能になりますが、サイジングを機能させるには、より明示的なコードが必要になります。ResizeCompositeこれを行う最も簡単な方法は、の代わりに拡張することですComposite。または、

  • ウィジェットを拡張しないでください(つまり、Composite/ ResizeComposite/ etcを拡張しないでください)が、代わりにを実装してIsWidgetください。これにより、ツリーに新しいWidgetタイプを追加する必要がなくなり、使用しているすべてのウィジェットを、たまたまビルドしてセットアップするタイプにグループ化することができます。これは私の好みのオプションです-ウィジェットのようには見えない、モックが簡単ななどですasWidget()。ウィジェット構造のベースを返すメソッドが必要です-これを追加すると、それに直接対話します(そして直接呼び出すonResize())、相互作用する必要がある方法の詳細を無視できるようにします。これは私の好みのオプションです。

于 2013-01-15T21:27:20.573 に答える
1

それははるかに簡単です:

Window.addResizeHandler(new ResizeHandler() {

    @Override
    public void onResize(ResizeEvent event) {
        resize();
    }

});

private void resize() {
        // Measure your widget
        // Decide how many squares to display
}

ビューが最初に読み込まれるときに resize() を呼び出す必要があります。その後、ウィンドウのサイズ変更によってもこのメソッドがトリガーされます。

于 2013-01-15T23:21:12.430 に答える
0

サイズ変更イベントが必要な場合は、RequiresResize を実装し、Provides/RequiresResize チェーンを維持するだけで済みます。しかし、あなたの場合、サイズ変更イベントではなく、ウィンドウまたはコンテナーのサイズを知りたいだけです(少なくとも、それはあなたの質問から推測したものです)。

その場合、ページネーションを決定する前に、コンテナー ウィジェットの getOffsetWidth() および getOffsetHeight() メソッドを使用できます ( http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwtを参照)。 /user/client/ui/UIObject.html#getOffsetHeight() )。

一方、ウィンドウサイズが変更されたときに物事を再レイアウトする必要がある場合は、あなたが言うように Provides/RequireResize を使用する必要があります。完全な階層を維持したくない場合は、非表示の LayoutPanel をルート レイアウト パネルに配置し、サイズ変更イベントを任意の場所にルーティングします。あまりきれいな解決策ではありませんが、解決策...

于 2013-01-15T20:30:09.993 に答える