2012-07-05 22 views
7

Tôi muốn có một số ScrolledComposite có phụ huynh với GridLayout nhưng thanh cuộn không hiển thị, trừ khi tôi sử dụng FillLayout. Vấn đề của tôi với FillLayout là trẻ em của nó có phần bằng nhau của không gian có sẵn.ScrolledComposite parent with GridLayout

Trong trường hợp của tôi có hai tiện ích, một tiện ích trên đầu sẽ không được nhiều hơn 1/4 cửa sổ và ScrolledComposite sẽ chiếm phần còn lại. Tuy nhiên, cả hai đều mất một nửa số đó.

Có cách nào để sử dụng số GridLayout với ScrolledComposite hoặc có thể sửa đổi hành vi của FillLayout không?

Dưới đây là mã của tôi:

private void initContent() { 

    //GridLayout shellLayout = new GridLayout(); 
    //shellLayout.numColumns = 1; 
    //shellLayout.verticalSpacing = 10; 
    //shell.setLayout(shellLayout); 
    shell.setLayout(new FillLayout(SWT.VERTICAL)); 

    searchComposite = new SearchComposite(shell, SWT.NONE); 
    searchComposite.getSearchButton().addListener(SWT.Selection, this); 

    ScrolledComposite scroll = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); 
    scroll.setLayout(new GridLayout(1, true)); 

    Composite scrollContent = new Composite(scroll, SWT.NONE); 
    scrollContent.setLayout(new GridLayout(1, true)); 

    for (ChangeDescription description : getChanges(false)) { 
     ChangesComposite cc = new ChangesComposite(scrollContent, description); 
    } 

    scroll.setMinSize(scrollContent.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
    scroll.setContent(scrollContent); 
    scroll.setExpandVertical(true); 
    scroll.setExpandHorizontal(true); 
    scroll.setAlwaysShowScrollBars(true); 

} 
+3

Tôi có cùng một vấn đề, bạn đã bao giờ tìm thấy giải pháp chưa? –

Trả lời

1

Tôi nghĩ rằng những gì bạn đang thiếu ở đây là để xác định GridData cho trẻ em.

Bố cục kiểm soát vị trí và kích thước của trẻ em. Và mọi lớp bố cục đều có lớp dữ liệu bố cục tương ứng cho phép định cấu hình từng trẻ cụ thể trong bố cục, nếu chúng lấp đầy toàn bộ không gian, bao nhiêu ô chúng mất, v.v.

Tôi đoán bố cục lưới của bạn có thể có 4 hàng , với các widget trên đầu chỉ lấy một tế bào và đứa trẻ còn lại dùng phần còn lại (3). Điều này đạt được thông qua tài sản GridData.verticalSpan.

Hãy xem Understanding Layouts in SWT và thử các thuộc tính dữ liệu bố cục khác nhau để xem chúng làm gì.

+0

Xin lỗi, tôi nghĩ tôi chưa đủ rõ ràng. Vấn đề chính là ScrolledComposite không hiển thị thanh cuộn của nó nếu tôi đặt nó trong GridLayout, nó chỉ hoạt động với một FillLayout - nhưng nó không phù hợp với nhu cầu của tôi. Tôi sẽ chỉnh sửa bài đăng gốc để làm rõ điều này. – gombost

+0

Lực lượng 'FillLayout' điều khiển có cùng kích thước. Ban đầu, các điều khiển sẽ cao bằng kiểm soát cao nhất và rộng nhất với điều khiển rộng nhất. Dường như bố cục này khiến các điều khiển của bạn đủ lớn cho 'ScrolledComposite' để hiển thị thanh cuộn. Nhưng khi bạn có 'GridLayout', bạn phải chỉ định cách điều khiển nằm trong mỗi ô thông qua các đối tượng' GridData'. Điều này xác định kích thước của chúng. Nếu bạn không làm điều đó có lẽ nội dung không đủ lớn. Chỉ cần đoán O :) –

2

Ngoài setLayout(), cần gọi setLayoutData(). Trong ví dụ mã sau đây, hãy xem cách các đối tượng GridData được xây dựng và truyền cho từng cuộc gọi setLayoutData() hai.

private void initContent(Shell shell) 
{ 
    // Configure shell 
    shell.setLayout(new GridLayout()); 

    // Configure standard composite 
    Composite standardComposite = new Composite(shell, SWT.NONE); 
    standardComposite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); 

    // Configure scrolled composite 
    ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); 
    scrolledComposite.setLayout(new GridLayout()); 
    scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
    scrolledComposite.setExpandVertical(true); 
    scrolledComposite.setExpandHorizontal(true); 
    scrolledComposite.setAlwaysShowScrollBars(true); 

    // Add content to scrolled composite 
    Composite scrolledContent = new Composite(scrolledComposite, SWT.NONE); 
    scrolledContent.setLayout(new GridLayout()); 
    scrolledComposite.setContent(scrolledContent); 
} 
+1

Gọi 'scrolledComposite.setLayout (...)' không làm gì cả. 'ScrolledComposite' ghi đè phương thức và không đặt bố cục, vì nó đã có' ScrolledCompositeLayout' theo mặc định. Vì vậy, không biết những gì xảy ra trên các cuộc gọi '. SetLayoutData' trên các con của nó. –

2

NB! Câu trả lời này dựa trên Eclipse RAP có thể hoạt động khác với SWT thông thường.

Tôi đã đấu tranh với cùng một vấn đề chính xác một vài ngày trước. Tôi đã có hai ScrolledComposite s trên cùng một trang và tôi cần thiết rằng một bên trái sẽ không mất nhiều không gian hơn sau đó cần thiết (ngay cả khi không gian sẽ có sẵn).

Trong khi cố gắng ra các giải pháp khác nhau tôi nhận thấy rằng các hành vi của một ScrolledComposite phụ thuộc vào LayoutData của nó như sau:

  • Nếu layoutData được thiết lập để new GridData(SWT.LEFT, SWT.TOP, false, true) thì ScrolledComposite sẽ giữ nó dành kích thước bất kể cha mẹ Composite thay đổi kích thước.
  • Nếu layoutData được đặt thành new GridData(SWT.LEFT, SWT.TOP, true, true), thì ScrolledComposite sẽ thu nhỏ/mở rộng theo thay đổi kích thước của phụ huynh Composite. Điều này cũng bao gồm mở rộng đến chiều rộng lớn hơn mong muốn (có nghĩa là các cột được giữ bằng nhau).

Dựa vào hành vi này tôi đã có thể giải quyết vấn đề bằng cách thêm một người biết lắng nghe thay đổi kích thước cho phụ huynh Composite rằng thay đổi layoutData của ScrolledComposite trái dựa trên phụ huynh Composite size.

Cách tiếp cận này được minh họa ví dụ sau:

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

Tuy nhiên phương pháp này dường như với tôi một chút quá "hackish" giải pháp. Vì vậy, tôi rất thích nhìn thấy một cách tiếp cận tốt hơn.

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