2009-06-07 24 views
5

Tôi muốn tạo bố cục Chi tiết chính cho một trong các ứng dụng của tôi bằng SWT.SWT: Bố cục lồng nhau với ScrolledComposite vượt quá không gian có sẵn

Vùng chứa, Nội dung, Thanh bên và Part1 là các phiên bản Tổng hợp. cuộn là một ScrolledComposite

Cách bố trí mong muốn là một cái gì đó như:

+--Container-------------------------------------+ 
|+--Content----------------------++--Sidebar----+| 
||        ||+--Part1----+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
||        ||+--Scrolled-+|| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        |||   ||| 
||        ||+-----------+|| 
|+-------------------------------++-------------+| 
+------------------------------------------------+ 

Nội dung nên lấy tất cả các không gian ngang và dọc có sẵn.

Thanh bên về cơ bản là vùng chứa cho Phần 1 và Cuộn có chiều cao bằng nhau.

Đã cuộn là vùng chứa cho một Hỗn hợp chứa số lượng động các mục con được sắp xếp trong tổng hợp nội dung. Bởi vì có thể có một sự thay đổi lớn về số lượng các mục con, nên Composite này có thể cuộn được.

bây giờ tôi đã thực hiện điều này theo cách sau:

  • container có một GridLayout với 2 colums.

  • Bên trong đó nội dung có hành vi FILL_BOTH và cũng lấy tất cả không gian HORIZONTAL/VERTICAL.

  • Thanh bên có FillLayout (SWT.VERTICAL) và chứa các Part1 và các con đã cuộn.

Vấn đề: Khi đặt rất nhiều các mặt hàng vào hỗn cuộn và cách bố trí chỉ tràn không gian có sẵn và không có di chuyển có sẵn, nơi nó nên được.

Khi tôi sử dụng FillLayout (SWT.HORIZONTAL) cho vùng chứa, hành vi như mong muốn, vì có cuộn và mọi thứ đều là "giới hạn bên trong".

Có cách nào để đạt được hành vi này cũng khi sử dụng GridLayout vì tôi muốn nội dung chiếm hầu hết không gian.

đính kèm đoạn thử nghiệm SWT hiện tại:

public class Scrolled { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(2,false)); 
     //shell.setLayout(new FillLayout(SWT.HORIZONTAL)); 

     Composite content = new Composite(shell, SWT.BORDER); 
     content.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite sidebar = new Composite(shell, SWT.BORDER); 
     sidebar.setLayout(new FillLayout(SWT.VERTICAL)); 
     sidebar.setLayoutData(new GridData(SWT.LEFT,SWT.CENTER,false,false)); 

     Composite cc = new Composite(sidebar, SWT.BORDER); 

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

     Composite c = new Composite(sc, SWT.NONE); 
     c.setSize(400, 400); 
     c.setLayout(new GridLayout(1, true)); 

     for(int i = 0; i < 1000; i++){ 
      new Button(c, SWT.PUSH).setText("Text"); 
     } 

     sc.setMinSize(c.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
     sc.setContent(c); 
     sc.setExpandHorizontal(true); 
     sc.setExpandVertical(true); 
     sc.setAlwaysShowScrollBars(true); 

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

Trả lời

5

có vẻ như tôi tìm thấy giải pháp.

Có vẻ như trường hợp Composite phải mất GRAB_EXCESS_VERTICAL để bị giới hạn ở độ rộng có sẵn. Nếu không thì thành phần được gán chiều cao ưa thích là chiều cao tối đa để hiển thị tất cả cùng một lúc.

Các thay đổi mã sau đã thực hiện thủ thuật:

content.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true)); 

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true)); 
Các vấn đề liên quan