3

私は2つのボタンを水平にScrolledComposite保持しています(実際には2つのボタンを持つコンポジット)。スクロール バーが非表示の場合でも、スクロール バー用のスペースが割り当てられます。(横方向のスペースが十分にあり、スクロールする必要がない場合は非表示になります。)

ここに画像の説明を入力

この無駄なスペースをなくすにはどうすればよいでしょうか。

それまでの間、スクロールしたコンポジットを常にスクロールバー ( setAlwaysShowScrollBars(true)) を表示するように構成しましたが、無駄なスペースを取り除くことを好みます。

ここに画像の説明を入力

ご検討をお願いいたします。

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class ScrollbarSpaceIssue extends Composite
{
    public ScrollbarSpaceIssue(final Composite parent, final int style)
    {
        super(parent, style);

        setLayout(new GridLayout(1, false));

        final ScrolledComposite scrolledComposite = new ScrolledComposite(this, SWT.BORDER | SWT.H_SCROLL);
        scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        //scrolledComposite.setAlwaysShowScrollBars(true);
        {
            final Composite composite = new Composite(scrolledComposite, SWT.NONE);
            composite.setLayout(new GridLayout(2, false));
            {
                final Button btn1 = new Button(composite, SWT.NONE);
                btn1.setText("Button 1");

                final Button btn2 = new Button(composite, SWT.NONE);
                btn2.setText("Button 2");
            }

            scrolledComposite.setContent(composite);
            scrolledComposite.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        }

        pack();
    }

    public static void main(final String[] args)
    {
        final Display display = new Display();

        final Shell shell = new Shell(display);
        shell.setText("Testcase");
        shell.setLayout(new FillLayout());

        new ScrollbarSpaceIssue(shell, SWT.NONE);

        shell.pack();
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}
4

1 に答える 1

3

「無駄なスペース」がある理由はScrolledComposite、スクロールバーが表示されているかどうかに関係なく、オブジェクトの推奨サイズにスクロールバー用のスペースが含まれているためです。このデフォルト機能を無効にするには、次のScrolledCompositeように拡張して、優先サイズの計算をオーバーライドできます。

class PackedScrolledComposite extends ScrolledComposite
{
    Point scrollBarSize;  // Size of OS-specific scrollbar

    public PackedScrolledComposite(Composite parent, int style)
    {
        super(parent, style);

        Composite composite = new Composite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        composite.setSize(1, 1);
        scrollBarSize = composite.computeSize(0, 0);
        composite.dispose();
    }

    public Point computeSize(int wHint, int hHint, boolean changed)
    {
        Point point = super.computeSize(wHint, hHint, changed);
        point.x += ((getStyle() & SWT.V_SCROLL) != 0) ? -scrollBarSize.x : 0;
        point.y += ((getStyle() & SWT.H_SCROLL) != 0) ? -scrollBarSize.y : 0;

        return point;
    }
}
于 2014-02-23T00:13:11.700 に答える