SWT : 스크롤 컴포지트가있는 중첩 레이아웃은 사용 가능한 공간을 초과합니다
-
12-09-2019 - |
문제
SWT를 사용하여 응용 프로그램 중 하나에 대한 마스터-디테일 레이아웃을 만들고 싶습니다.
컨테이너, 컨텐츠, 사이드 바 및 Part1은 복합 인스턴스입니다. 스크롤은 스크롤 컴포지트입니다
원하는 레이아웃은 다음과 같습니다.
+--Container-------------------------------------+
|+--Content----------------------++--Sidebar----+|
|| ||+--Part1----+||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||+-----------+||
|| ||+--Scrolled-+||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||| |||
|| ||+-----------+||
|+-------------------------------++-------------+|
+------------------------------------------------+
콘텐츠는 사용 가능한 모든 공간을 수평 및 수직으로 가져와야합니다.
사이드 바는 기본적으로 Part1 용 컨테이너이며 높이가 같아야합니다.
스크롤은 컨텐츠 복합재에 배열 된 동적 수의 하위 항목을 포함하는 복합재 용 컨테이너입니다. 하위 항목 수의 큰 변형이있을 수 있으므로이 합성물을 스크롤 할 수 있어야합니다.
이제 다음과 같은 방식으로 이것을 구현했습니다.
컨테이너에는 2 개의 Colums가있는 그리드 레이 아웃이 있습니다.
그 안에 내용에는 Fill_both 동작이 있으며 모든 수평/수직 공간도 잡습니다.
사이드 바에는 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();
}
}
해결책
해결책을 찾은 것 같습니다.
복합재가 취해야하는 경우 인 것 같습니다. GRAB_EXCESS_VERTICAL
가용 너비로 제한됩니다. 그렇지 않으면 구성 요소에 선호하는 높이가 할당됩니다.이 높이는 한 번에 모두 표시 할 최대 높이입니다.
다음 코드 변경이 트릭을 수행했습니다.
content.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));
sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true));