8

ScrolledComposite親を持つがGridLayout欲しいのですが、を使用しないとスクロールバーが表示されませんFillLayout。私の問題FillLayoutは、その子が利用可能なスペースの等しい部分を占めることです。

私の場合、ウィジェットは2つあり、一番上のウィジェットはウィンドウの1/4以下を占めScrolledComposite、残りのスペースを占める必要があります。しかし、両方ともその半分を占めています。

GridLayoutwithを使用する方法はありますか、ScrolledCompositeまたはの動作を変更することは可能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);

}
4

3 に答える 3

4

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);
}
于 2014-02-22T07:41:59.143 に答える
2

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

私は数日前にまったく同じ問題に苦しんでいました。同じページに2つScrolledCompositeのsがあり、左側の1つが必要以上のスペースをとらないようにする必要がありました(スペースが利用可能であっても)。

さまざまなソリューションを試しているときに、aの動作が次のようScrolledCompositeに依存していることに気付きました。LayoutData

  • layoutDataがに設定されている場合、new GridData(SWT.LEFT, SWT.TOP, false, true)ScrolledComposite親のCompositeサイズの変更に関係なく、意図したサイズを維持します。
  • layoutDataがに設定されている場合、new GridData(SWT.LEFT, SWT.TOP, true, true)ScrolledComposite親のサイズ変更に応じて縮小/拡大しCompositeます。これには、必要なより広い幅への拡張も含まれます(つまり、列が等しく保たれます)。

この動作に基づいて、親に基づいて左側のサイズをComposite変更するサイズ変更リスナーを親に追加することで、問題を解決することができました。layoutDataScrolledCompositeComposite size

このアプローチは、次の例で示されています。

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
            }
        });
    }
}

しかし、このアプローチは私には少し「ハック」な解決策のように思えます。したがって、私はより良いアプローチを見たいと思います。

于 2016-04-06T16:07:10.500 に答える
1

GridDataここで欠けているのは、子供たちのためにを定義することだと思います。

レイアウトは、子の位置とサイズを制御します。また、すべてのレイアウトクラスには、対応するレイアウトデータクラスがあり、スペース全体を埋める場合、レイアウト内の特定の子を構成したり、セルの数などを構成したりできます。

グリッドレイアウトは4行で、一番上のウィジェットが1つのセルだけを取り、もう1つの子が残りを取ります(3)。これは、GridData.verticalSpanプロパティを通じて実現されます。

SWTのレイアウトについてを見て、さまざまなレイアウトデータプロパティを試して、それらが何をするかを確認してください。

于 2012-07-05T10:32:47.810 に答える