SWT : 스크롤 컴포지트가있는 중첩 레이아웃은 사용 가능한 공간을 초과합니다

StackOverflow https://stackoverflow.com/questions/961545

문제

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));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top