2013-11-25 19 views
5

Tôi đang làm việc trên vải này Composite trên đó có thể thêm và xóa Composite s khác.Thay đổi kích thước vỏ SWT tùy thuộc vào trẻ em

Sự hiểu biết của tôi về cách khái niệm toàn bộ nằm trong sương mù.

Khi trẻ em được thêm vào thùng chứa, với thực tế là vật chứa có GridData chứa đầy trong phụ huynh, không nên phụ huynh cũng biết rằng con đã thay đổi kích cỡ? Trẻ em vẫn còn ẩn sau khi container của họ đã được đặt ra, vì vỏ (cha mẹ hàng đầu).

Nếu câu hỏi quá mơ hồ, đừng ngần ngại hỏi thêm chi tiết. Ngoài ra, hãy cố gắng hết sức để không chỉ cho tôi đến số Tìm hiểu bố cục trong bài viết 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++)); 
    } 
} 

Thực tế thú vị: Câu hỏi này được veeeery liên quan to this other one, that was posted 9 minutes ago. Một người nào đó hoặc là tâm linh hoặc rình rập tôi.

Trả lời

11

Để có được Shell để thay đổi kích thước bạn cần phải bố trí tất cả mọi thứ và tính toán lại kích thước của nó:

shell.layout(true, true); 

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

shell.setSize(newSize); 

Bạn có thể nhận được ngay với gọi layout() trên một con Composite của vỏ tùy thuộc vào những gì đã thay đổi.

+0

Giải pháp của bạn dường như hoạt động cho một ví dụ phức tạp hơn. Tôi tự hỏi nếu 'shell.setSize (Point)' là bắt buộc trong trường hợp của tôi (về cơ bản là 'pack (true)'). Tôi sẽ lấy lại cho các bạn sau khi tôi hoàn thành việc thực hiện toàn bộ. – GGrec

+0

'gói (đúng)' không giống như hai dòng cuối cùng của tôi. Mã tôi trích xuất này cũng kiểm tra kích thước tối thiểu mà không thể được thực hiện với 'gói'. –

+0

@ greg-449 giống với combobox JFace. Tôi đã hỏi một câu hỏi [ở đây] (http://stackoverflow.com/questions/32561924/how-to-truncate-a-long-name-in-a-jface-combobox). –

3

Bí mật ở đây có thể giải quyết được vấn đề của bạn là GHI bố mẹ rằng các con đã được thay đổi kích cỡ. Vì vậy, không, họ không tự động biết điều đó đã xảy ra.

cách để sửa lỗi này, là để gọi:

Parent.layout(true)

từ api swt:

public void layout(boolean changed) 

Nếu người nhận có một bố cục, yêu cầu bố trí để đặt (có nghĩa là, đặt kích thước và vị trí của) con của người nhận. Nếu đối số là đúng thì bố cục không được dựa vào bất kỳ thông tin nào mà nó đã lưu trong bộ nhớ cache về các con ngay lập tức. Nếu sai thì bố cục có thể (có khả năng) tối ưu hóa công việc mà nó đang thực hiện bằng cách giả định rằng không có con của người nhận nào thay đổi trạng thái kể từ lần bố trí cuối cùng. Nếu người nhận không có bố cục, không làm gì cả.

Nếu một đứa trẻ được thay đổi kích cỡ do cuộc gọi đến bố cục, sự kiện thay đổi kích thước sẽ gọi bố cục của trẻ. Bố trí sẽ xếp xuống qua tất cả các widget con trong cây widget của người nhận cho đến khi một đứa trẻ gặp phải mà không thay đổi kích cỡ. Lưu ý rằng bố cục do thay đổi kích thước sẽ không xóa bất kỳ thông tin được lưu trong bộ nhớ cache nào (giống như bố cục (sai)).

Lưu ý: Bố cục khác với vẽ. Nếu một đứa trẻ được di chuyển hoặc thay đổi kích cỡ sao cho một khu vực trong cha mẹ được phơi bày, thì phụ huynh sẽ vẽ. Nếu không có trẻ bị ảnh hưởng, cha mẹ sẽ không sơn.

 
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 

Vì vậy, trong trường hợp của bạn, gọi layout() chức năng trên công ty mẹ của composit của bạn bất cứ lúc nào chúng được thêm vào sẽ giúp bạn ra ngoài.

+0

Trong trường hợp khác, tôi đã thử gọi 'layout' trên' Shell'. Dường như không hoạt động vào thời điểm đó. Điều này có áp dụng cho 'Dialog' và 'Wizard' không? Làm thế nào * cao * lên làm bạn phải đi gọi API? – GGrec

+0

Tôi có một bản sao của một số mã tôi đã viết một thời gian ngắn trước khi làm điều này cùng một chính xác, khi tôi nhận được từ công việc tôi sẽ phá vỡ nó mở và xem những gì là sự khác biệt. Tôi nhớ có một vài tinh tế mà tôi phải chơi cho đến khi nó hoạt động. Một trong số đó thực sự gọi là 'bố cục (đúng)' mỗi lần tôi tạo ra một hỗn hợp mới, nhưng tôi sẽ liên lạc trong vài giờ! trừ khi tôi có cảm hứng và trí nhớ, thì nó sẽ sớm hơn. – WillBD

+0

Ok, vì vậy sau khi đọc lại cả câu hỏi của bạn và câu hỏi bạn đã đề cập ở dưới cùng, tôi có thể đã nhầm lẫn bản thân mình ở đây. Vấn đề chính là bạn không thể thấy các nút động mới? hoặc toàn bộ hệ vỏ sẽ không thay đổi kích thước sau khi bạn tạo quá nhiều? – WillBD

0

Như bạn đã nói cả hai câu hỏi của chúng tôi đều giống nhau, tôi đăng giải pháp những gì tôi đã đạt được. Hãy cho tôi biết nếu điều này giúp bạn.

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

} 
} 
+0

Rõ ràng điều này giải quyết vấn đề của bạn, nhưng không phải của tôi. Xem điều này là ... khi bạn thêm vào nhiều, họ có xu hướng tắt màn hình và bạn không thể thay đổi kích thước hộp thoại theo cách thủ công để xem chúng. Hộp thoại sẽ tự động thay đổi kích thước -> xem 2 câu trả lời còn lại. :-) – GGrec

+0

@GGrec có chính xác, bây giờ đây là vấn đề của tôi, bất cứ khi nào tôi tạo ra các vật dụng mới trong hỗn hợp, khi bao giờ kết thúc kích thước mặc định, nó sẽ đi vào hộp thoại và thanh cuộn không xuất hiện. Bạn có biết làm thế nào để giải quyết điều này, bởi vì tôi đã không hoàn toàn hiểu các giải pháp trên? , cảm ơn – Juseeth

Các vấn đề liên quan