簡體   English   中英

SWT Shell會根據孩子的大小調整大小

[英]SWT Shell resize depending on children

我正在處理這個Composite畫布,其中可以添加和刪除其他Composite

我對整個布局概念仍處於迷霧中的理解。

當子容器被添加到容器中時,考慮到容器具有填充父容器的GridData這一事實,父容器是否也應該知道子容器已調整大小? 由於shell(頂級父級),因此在容器布置后,子項仍然隱藏。

如果問題太模糊,請不要猶豫,詢問更多細節。 另外,請盡量不要將我指向SWT文章中的“ 理解布局 ”。

/**
 * 
 * @author ggrec
 *
 */
public class SSCCE
{

    // ==================== 2. Instance Fields ============================

    private Composite componentContainer;

    private int componentCount = 0;

    // ==================== 3. Static Methods =============================

    public static void main(final String[] args)
    {
        new SSCCE();
    }

    // ==================== 4. Constructors ===============================

    private SSCCE()
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        createContents(shell);

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

    // ==================== 5. Creators ===================================

    private void createContents(final Composite parent)
    {
        parent.setLayout(new GridLayout());
        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        final Button button = new Button(parent, SWT.PUSH);
        button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        button.setText("Add New Component");

        button.addSelectionListener(new SelectionAdapter()
        {
            @Override public void widgetSelected(final SelectionEvent e)
            {
                addNewComponent();

                componentContainer.layout();
            }
        });

        componentContainer = new Composite(parent, SWT.BORDER);
        componentContainer.setLayout(new GridLayout());
        componentContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    }

    // ==================== 6. Action Methods =============================

    private void addNewComponent()
    {
        final Composite component = new Composite(componentContainer, SWT.BORDER);
        component.setLayout(new FillLayout());
        component.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));

        final Label label = new Label(component, SWT.NONE);
        label.setText( String.valueOf(componentCount++) );
    }
}

有趣的事實 :這個問題是與另一個相關的問題,發布於9分鍾前 有人要么是通靈的,要么跟蹤我。

要讓Shell調整大小,您需要布局所有內容並重新計算其大小:

shell.layout(true, true);

final Point newSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);  

shell.setSize(newSize);

您可以在shell的子Composite上調用layout() ,具體取決於更改的內容。

這里可能解決你的問題的秘訣是告訴父母孩子們已經調整了大小。 所以,不,他們不會自動知道它已經發生了。

修復此問題的方法是調用:

Parent.layout(true)

來自swt api:

public void layout(boolean changed)

如果接收器有布局,則要求布局布局(即設置接收器的子節點的大小和位置)。 如果參數為true,則布局不得依賴於已緩存的有關直接子節點的任何信息。 如果它是假的,布局可以(可能)通過假設接收器的子節點自上次布局以來沒有改變狀態來優化它正在進行的工作。 如果接收器沒有布局,則不執行任何操作。

如果由於調用布局而調整子項的大小,則resize事件將調用子項的布局。 布局將在接收器的窗口小部件樹中向下級聯所有子窗口小部件,直到遇到未調整大小的子窗口。 請注意,由於調整大小而導致的布局不會刷新任何緩存的信息(與布局(false)相同)。

注意:布局與繪畫不同。 如果孩子被移動或調整大小以使父母中的某個區域暴露出來,那么父母將會畫畫。 如果沒有孩子受到影響,父母將不會畫畫。

Parameters:
    changed - true if the layout must flush its caches, and false otherwise
Throws:
    SWTException -
    ERROR_WIDGET_DISPOSED - if the receiver has been disposed
    ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver

因此,在您的情況下,無論何時添加復合體的父級都調用layout()函數可以幫助您。

正如你所說,我們兩個問題都是相似的,我正在發布我已經取得的成就。 如果這有助於您,請告訴我。

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Combo;


public class DynamicDialog extends Dialog {
   private Composite composite_2;


    /**
     * Create the dialog.
     * @param parentShell
     */
    public DynamicDialog(Shell parentShell) {
        super(parentShell);
    }

    /**
     * Create contents of the dialog.
     * @param parent
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite container = (Composite) super.createDialogArea(parent);
        container.setLayout(new FillLayout(SWT.HORIZONTAL));

        ScrolledComposite scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);

        final Composite composite = new Composite(scrolledComposite, SWT.NONE);
        composite.setLayout(new GridLayout(1, false));
        scrolledComposite.setContent(composite);
        scrolledComposite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        Composite composite_1 = new Composite(composite, SWT.NONE);
        composite_1.setLayout(new GridLayout(2, false));
        GridData gd_composite_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_composite_1.heightHint = 49;
        gd_composite_1.widthHint = 427;
        composite_1.setLayoutData(gd_composite_1);

        Label lblDefault = new Label(composite_1, SWT.NONE);
        lblDefault.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
        lblDefault.setText("Default:");

        Combo combo = new Combo(composite_1, SWT.NONE);
        combo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));

        composite_2 = new Composite(composite, SWT.NONE);
        composite_2.setLayout(new GridLayout(4, false));
        GridData gd_composite_2 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        /*gd_composite_2.heightHint = 32;
        gd_composite_2.widthHint = 426;*/
        composite_2.setLayoutData(gd_composite_2);

        Composite composite_3 = new Composite(composite, SWT.NONE);
        composite_3.setLayout(new GridLayout(1, false));
        GridData gd_composite_3 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_composite_3.heightHint = 38;
        gd_composite_3.widthHint = 427;
        composite_3.setLayoutData(gd_composite_3);

        Button btnAdd = new Button(composite_3, SWT.NONE);
        btnAdd.setText("Add");
        btnAdd.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {


                Label label2 = new Label(composite_2, SWT.NONE);
                label2.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
                        false, 1, 1));
                label2.setText("1");

                Text text_12 = new Text(composite_2, SWT.BORDER);
                text_12.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
                        false, 1, 1));

                Text text13 = new Text(composite_2, SWT.BORDER);
                text13.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
                        false, 1, 1));

                Button btnDelete = new Button(composite_2, SWT.NONE);
                btnDelete.setText("delete");
                composite_2.layout(true);


                composite_2.layout();
                // Point p = composite.getSize();
                // composite.setSize(SWT.DEFAULT,SWT.DEFAULT);
                // composite.setSize(p);

                composite.layout();


            }
        });






        return container;
    }

    /**
     * Create contents of the button bar.
     * @param parent
     */
    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
                true);
        createButton(parent, IDialogConstants.CANCEL_ID,
                IDialogConstants.CANCEL_LABEL, false);
    }

    /**
     * Return the initial size of the dialog.
     */
    @Override
    protected Point getInitialSize() {
        return new Point(450, 300);
    }

public static void main(String[] args){

    Shell shell =  new Shell(new Display());
    //shell.setLayout(new FillLayout());
    DynamicDialog dd = new DynamicDialog(shell);
    dd.open();

}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM