0

次のSWTレイアウトがあります。

  • TabItem
    • SashForm
      • コンポジット(GridLayout)
        • ラベル(塗りつぶしW、グラブH)
        • ScrolledComposite(W / Hを埋め、H / Vをつかむ)
          • コンポジット(RowLayout)
      • コンポジット(GridLayout)
        • ラベル(塗りつぶしW、グラブH)
        • ScrolledComosite(W / Hを埋め、H / Vをつかむ)
          • コンポジット(RowLayout)

一般的な考え方は、サッシを介して幅を調整できる2つの同一のペインが並んでいて、各パネルの内側に上部にラベルがあり、下部にスクロールされたコンポジットがあるというものです。スクロールされたコンポジットには、ラップされたコンポジット内に多数(1〜50)の100x100コンポジットが含まれます。

問題は、サッシュフォームに含まれている場合、子の数が多いために内部コンポジットが大きくなると、スクロールされたコンポジットがスクロールしないことです。SashFormを放棄し、次のように通常のコンポジットを使用しても、この問題は発生しません。

  • TabItem
    • コンポジット(GridLayout)
      • ラベル
      • ScrolledComposite
        • 複合
      • ラベル
      • ScrolledComposite
        • 複合

このように、余分な複合コンテナはなく、すべてがグリッドレイアウトになっています。唯一の問題は、共通のインターフェイス(サッシ)を介してペインの幅を調整できないことです。


を使用してレイアウトを強制しlayout()、を使用して最小サイズを設定してみsetMinSize()ました。RowLayoutをFlowLayout(swing2swt)と交換してみました。これは一種のレイアウトの問題だと思いますが、それを解決するのに十分なSWTの経験がありません。スクロールの問題を除いて、レイアウトは完璧です。

ソースの例

すべてのコードはWindowBuilderProによって自動生成され、指定した複合ツリーを構築することで複製できます。ラップされたコンポジットにデータを取り込むために使用しているフラグメントは次のとおりです。

public void populate(Composite composite, List<Photo> items) {
   composite.setRedraw(false);
   for (Photo photo : photos) {
     PhotoComposite composite = new PhotoComposite(composite, photo, SWT.NONE);
     composite.setSize(100, 100);
   }
   composite.setRedraw(true);
   composite.layout(true);
}

Photoは単純なPOJOであり、PhotoCompositeは、従来のコンポジットビットとスタイルビットに加えて、コンストラクターのパラメーターとして写真を受け取るカスタムコンポジットです。私の実験によれば、このコードは正常に機能しているようです。

4

1 に答える 1

0

問題はの誤解だったことがわかりましたsetMinSize(int, int)。上記のpopulateメソッドに対する次の変更により、問題が解決しました。

public void populate(ScrolledComposite scroll, Composite composite, List<Photo> items) {
   composite.setRedraw(false);
   for (Photo photo : photos) {
     PhotoComposite composite = new PhotoComposite(composite, photo, SWT.NONE);
     composite.setSize(100, 100);
   }
   composite.setRedraw(true);
   composite.layout(true);

   scroll.setMinSize(composite.computeSize(scroll.getSize().x, SWT.DEFAULT));
}
于 2012-09-17T13:51:29.313 に答える