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
変更するサイズ変更リスナーを親に追加することで、問題を解決することができました。layoutData
ScrolledComposite
Composite 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
}
});
}
}
しかし、このアプローチは私には少し「ハック」な解決策のように思えます。したがって、私はより良いアプローチを見たいと思います。