2

これは、どの一般的なアプローチをとるかについての質問であるため、コードは含めていません。

要件: 2 つの垂直セクションを持つマルチページ エディター内にページを作成する必要があります。上のセクションにはツリーがあり、下のセクションにはテキスト フィールドがあります。ツリーとテキスト フィールドは、それぞれのセクションを埋める必要があります。各セクションは個別にスクロールする必要があり、間にスプリッターが必要です。エディターが開いているときに、エディターの表示領域を、指定した比率に基づいて 2 つのセクションに分割したいと考えています。次に、エディターのサイズが変更されると、2 つのセクションが比例して調整され、比率が維持され、ページに収まります。この方法では、エディター ページ自体にスクロール バーは表示されず、2 つのセクションだけに表示されます。

提案された解決策: 私の考えはSashForm、エディター ページに を追加し、そのサイズをSashFormエディターの表示領域と同じに設定することでした。次に、サイズ変更リスナーをエディター ページに追加し、サイズを調整してSashForm、ページとの同期を維持します。ただし、エディターの表示領域を取得する方法が見つかりません。したがって、を追加するSashFormと、各セクションがそのデータに適合するのに十分な大きさになり、エディター ページ自体にスクロールが追加されます。

私の要求を満たすことは可能ですか?

4

2 に答える 2

2

成功!重要なのは、 でサイズ変更イベントをリッスンすることでしたScrolledForm。私は Fedora でしかテストしていませんが、すぐに Windows を見てみましょう。私を悩ませている唯一のことは、バッファ定数の使用が少しハッキリしているように見えることです。

/**
 * Form page that contains a sash form and a button.  The sash form is dynamically sized to ensure
 * that it always fills the available space on the page.
 */
public class SashFormDemoPage extends FormPage
{
    /** Horizontal buffer needed to ensure that content fits inside the page */
    private static final int HORIZONTAL_BUFFER = 8;
    /** Vertical buffer needed to ensure that content fits inside the page */
    private static final int VERTICAL_BUFFER = 12;

    /** Percentages of the sash form occupied by the tree and text box respectively */
    private static final int[] SASH_FORM_WEIGHTS = new int[] {30, 70};


    /**
     * Constructor
     * 
     * @param editor    parent editor
     */
    public SashFormDemoPage(ComponentEditor editor)
    {
        super(editor, "sashFormDemoPage", "Demo");
    }


    /**
     * {@inheritDoc}
     */
    @Override
    protected void createFormContent(IManagedForm managedForm)
    {
        // Set page title
        ScrolledForm scrolledForm = managedForm.getForm();
        scrolledForm.setText("SashForm Demo");

        // Set page layout and add a sash form
        final Composite parent = scrolledForm.getBody();
        parent.setLayout(new GridLayout());
        final SashForm sashForm = new SashForm(parent, SWT.VERTICAL);

        // Add a tree as the top row of the sash form and fill it with content
        FormToolkit toolkit = managedForm.getToolkit();
        int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER;
        Tree tree = toolkit.createTree(sashForm, style);

        for (int i = 0; i < 40; i++) {
            TreeItem parentNode = new TreeItem(tree, SWT.NONE);
            parentNode.setText("parent-" + i);
            for (int j = 0; j < 3; j++) {
                TreeItem childNode = new TreeItem(parentNode, SWT.NONE);
                childNode.setText("child-" + i + "-" + j);
            }
        }

        // Add a text box as the bottom row of the sash form and fill it with content
        style = SWT.MULTI | SWT.V_SCROLL | SWT.WRAP | SWT.BORDER;
        Text text = toolkit.createText(sashForm, null, style);

        String message = "";
        for (int i = 0; i < 100; i++) {
            message += "This is a test of the layout demo system.  This is only a test.  ";
        }
        text.setText(message);

        // Add button below sash form
        final Button button = toolkit.createButton(parent, "Test", SWT.NONE);

        // Add resize listener to sash form's parent so that sash form always fills the page
        parent.addControlListener(new ControlListener() {
            @Override
            public void controlMoved(ControlEvent e)
            {
                // Stub needed to implement ControlListener
            }

            @Override
            public void controlResized(ControlEvent e)
            {
                GridData data = new GridData();
                Point size = parent.getSize();
                data.widthHint = size.x - HORIZONTAL_BUFFER;
                data.heightHint = size.y - button.getSize().y - VERTICAL_BUFFER;
                sashForm.setLayoutData(data);
            }
        });

        // Set sash form's weights and pack its parent so that the initial layout is correct
        sashForm.setWeights(SASH_FORM_WEIGHTS);
        parent.pack();
    }
}
于 2012-05-24T16:26:09.557 に答える
1

SashFormなぜ明示的にサイズを設定するのですか?Compositeエディターの親に追加してみませんか?親CompositeにはaがFillLayoutあり、したがってSashFormwithはエディター領域を自動的に埋めます。

于 2012-04-24T07:12:24.983 に答える