2012-07-05 4 views
7

親がGridLayoutScrolledCompositeがありますが、FillLayoutを使用しない限り、スクロールバーは表示されません。 FillLayoutの私の問題は、その子どもたちが利用可能なスペースの等しい部分を取ることです。ScrollledComposite親とGridLayout

私のケースでは、2つのウィジェットがあります。上部に1つはウィンドウの1/4を超えてはならず、ScrolledCompositeは残りのスペースを取るべきです。しかし、どちらも半分になります。

GridLayoutScrolledCompositeと一緒に使用する方法はありますか、またはFillLayoutの動作を変更することはできますか?

はここに私のコードです:

private void initContent() { 

    //GridLayout shellLayout = new GridLayout(); 
    //shellLayout.numColumns = 1; 
    //shellLayout.verticalSpacing = 10; 
    //shell.setLayout(shellLayout); 
    shell.setLayout(new FillLayout(SWT.VERTICAL)); 

    searchComposite = new SearchComposite(shell, SWT.NONE); 
    searchComposite.getSearchButton().addListener(SWT.Selection, this); 

    ScrolledComposite scroll = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); 
    scroll.setLayout(new GridLayout(1, true)); 

    Composite scrollContent = new Composite(scroll, SWT.NONE); 
    scrollContent.setLayout(new GridLayout(1, true)); 

    for (ChangeDescription description : getChanges(false)) { 
     ChangesComposite cc = new ChangesComposite(scrollContent, description); 
    } 

    scroll.setMinSize(scrollContent.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.setContent(scrollContent); 
    scroll.setExpandVertical(true); 
    scroll.setExpandHorizontal(true); 
    scroll.setAlwaysShowScrollBars(true); 

} 
+3

私は同じ問題を抱えていますが、解決策を見つけましたか? –

答えて

1

私はあなたがここで行方不明の子供のためのGridDataを定義することですしているものだと思います。

レイアウトは、子の位置とサイズを制御します。すべてのレイアウトクラスには対応するレイアウトデータクラスがあり、レイアウト内の各特定の子、それらが全部のスペースを占めるかどうか、セルの数などを設定できます。

グリッドレイアウトは4行上のウィジェットはただ1つのセルを取り、もう1人の子供は残りのものを取ります(3)。これはGridData.verticalSpanプロパティによって実現されます。

Understanding Layouts in SWTを見て、さまざまなレイアウトデータのプロパティを試してみてください。

+0

申し訳ありませんが、私は十分にはっきりしていなかったと思います。主な問題は、ScrolledCompositeがGridLayoutにスクロールバーを表示してもスクロールバーが表示されず、FillLayoutでしか動作しないということですが、それは私のニーズに合っていません。元の投稿を編集して、これを明確にします。 – gombost

+0

'FillLayout'はコントロールのサイズを同じにします。最初は、コントロールは最も高いコントロールと同じくらい広く、最も広いコントロールと同じになります。このレイアウトによって、コントロールがスクロールバーを表示するための 'ScrolledComposite'のために十分に大きくなるようです。しかし、 'GridLayout'を取得したら、' GridData'オブジェクトを通して各セルにコントロールをレイアウトする方法を指定する必要があります。これにより、サイズが決まります。あなたがそれをしないと、コンテンツが十分に大きくないかもしれません。ちょうどOを推測する:) –

2

setLayout()に加えて、setLayoutData()を呼び出す必要があります。次のコード例では、GridDataオブジェクトがどのように構築され、2つのsetLayoutData()呼び出しのそれぞれに渡されるかを見ていきます。

private void initContent(Shell shell) 
{ 
    // Configure shell 
    shell.setLayout(new GridLayout()); 

    // Configure standard composite 
    Composite standardComposite = new Composite(shell, SWT.NONE); 
    standardComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); 

    // Configure scrolled composite 
    ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); 
    scrolledComposite.setLayout(new GridLayout()); 
    scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
    scrolledComposite.setExpandVertical(true); 
    scrolledComposite.setExpandHorizontal(true); 
    scrolledComposite.setAlwaysShowScrollBars(true); 

    // Add content to scrolled composite 
    Composite scrolledContent = new Composite(scrolledComposite, SWT.NONE); 
    scrolledContent.setLayout(new GridLayout()); 
    scrolledComposite.setContent(scrolledContent); 
} 
+1

'scrolledComposite.setLayout(...)'を呼び出すことは何もしません。 'ScrolledComposite'はメソッドをオーバーライドし、デフォルトでは' ScrolledCompositeLayout'を既に持っているので、レイアウトを設定しません。したがって、その子の '.setLayoutData'呼び出しで何が起こるのか分かりません。 –

2

NB!この回答はEclipse RAPに基づいており、通常のSWTとは異なる動作をする可能性があります。

私は数日前にまったく同じ問題で苦労していました。私は同じページに2つのScrolledCompositeを持っていました。私は、左側にスペースが必要な場合でもスペースを取らないことが必要でした。 layoutDatanew GridData(SWT.LEFT, SWT.TOP, false, true)に設定されている場合

  • は、その後、ScrolledCompositeは、それは関係なく、親Compositeの大きさを意図しています維持します:別の解決策を試しながら

    iは次のようにScrolledCompositeの動作はそのLayoutDataに依存していることに気づきましたサイズの変更。
  • new GridData(SWT.LEFT, SWT.TOP, true, true)に設定されている場合、ScrolledCompositeは、親のサイズ変更に応じて縮小/拡大します。Compositeこれには、希望されていたより広い幅(カラムが等しく保たれていることを意味する)への拡張も含まれる。この動作に基づいて

私は親Composite sizeに基づいて左ScrolledCompositelayoutDataを変更する親Compositeにリサイズリスナーを追加することによって、問題を解決することができました。

このアプローチは、次の例を示している。

public class LayoutingScrolledComposites extends AbstractEntryPoint { 
    public void createContents(Composite parent) {  
     parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     parent.setLayout(new GridLayout(2, false)); 

     ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 
     Composite c1 = new Composite(sc1, SWT.BORDER); 
     sc1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true)); 
     c1.setLayout(new GridLayout(3, false)); 
     sc1.setContent(c1); 
     Label l1 = new Label (c1, SWT.BORDER); 
     l1.setText("Some text"); 
     l1 = new Label (c1, SWT.BORDER); 
     l1.setText("Some text"); 
     l1 = new Label (c1, SWT.BORDER); 
     l1.setText("Some text"); 
     c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

     ScrolledComposite sc2 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 
     sc2.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true)); 
     Composite c2 = new Composite(sc1, SWT.BORDER); 
     c2.setLayout(new GridLayout(3, false)); 
     sc2.setContent(c2); 
     Label l2 = new Label (c2, SWT.BORDER); 
     l2.setText("Some text"); 
     l2 = new Label (c2, SWT.BORDER); 
     l2.setText("Some text"); 
     l2 = new Label (c2, SWT.BORDER); 
     l2.setText("Some text"); 
     c2.setSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 

     parent.addListener(SWT.Resize, new Listener() { 
      public void handleEvent(Event e) { 
       int sc1_x = sc1.getContent().getSize().x; 
       int sc2_x = sc2.getContent().getSize().x; 

       //Enable/Disable grabExcessHorizontalSpace based on whether both sc's would fit in the shell 
       if (LayoutingScrolledComposites.this.getShell().getSize().x > sc1_x+sc2_x) { 
        if (((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) { 
         //sc1 does not change width in this mode 
         ((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=false;       
        } 
       } else { 
        if (!((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) { 
         //sc1 changes width in this mode 
         ((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=true;      
        } 
       } 
       parent.layout(); //Needed so that the layout change would take effect during the same event 
      } 
     }); 
    } 
} 

しかし、このアプローチは少しも「ハック」ソリューション私には思えません。だから私はより良いアプローチを見たいと思う。