2009-06-07 2 views
5

SWT를 사용하여 내 응용 프로그램 중 하나에 대한 마스터 - 세부 레이아웃을 작성하려고합니다.SWT : ScrolledComposite가있는 중첩 된 레이아웃이 사용 가능한 공간을 초과합니다.

컨테이너, 콘텐츠, 사이드 바 및 파트 1은 복합 인스턴스입니다. 수평으로 모든 공간을 잡아해야

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

콘텐츠 및 수직 즉 볼 수 있습니다 : 스크롤은 ScrolledComposite

원하는 레이아웃 같은 것을입니다.

사이드 바는 기본적으로 Part1과 Scrolled의 컨테이너이며 높이가 같아야합니다.

스크롤링은 콘텐츠 합성물에 배열 된 동적 인 하위 항목 수를 포함하는 합성물의 컨테이너입니다. 하위 항목 수에는 큰 차이가있을 수 있으므로이 복합 항목은 스크롤 할 수 있어야합니다.

지금은 다음과 같은 방법으로이를 구현 한 :

  • 컨테이너 2 colums과 GridLayout과가 있습니다.

  • 콘텐츠 내부에는 FILL_BOTH 동작이 있으며 모든 HORIZONTAL/VERTICAL 공간이 있습니다.

  • 사이드 바에는 FillLayout (SWT.VERTICAL)이 있으며 Part1 및 Scrolled Childs가 포함되어 있습니다.

문제 : 스크롤 한 복합에 항목을 많이 넣고 레이아웃 그냥 사용 가능한 공간을 넘쳐 그것이 있어야 가능한 스크롤이 없습니다.

컨테이너에 FillLayout (SWT.HORIZONTAL)을 사용하면 스크롤이 있고 모든 것이 "경계선"이기 때문에 동작이 원하는대로 작동합니다.

GridLayout을 사용할 때도이 동작을 얻을 수있는 방법이 있습니다. 왜냐하면 대부분의 공간을 콘텐츠로 가져 오기를 원하기 때문입니다.

은 현재 테스트 SWT 조각을 첨부 : 나는 해결책을 발견처럼

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

답변

5

보인다.

복합체가 사용 가능한 너비로 제한되도록 GRAB_EXCESS_VERTICAL을 가져 가야하는 경우입니다. 그렇지 않으면 구성 요소에 한 번에 모두 표시 할 최대 높이 인 기본 높이가 지정됩니다.

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

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true)); 
:

다음 코드 변경은 속임수를 썼는지

관련 문제