Frage

Ich möchte eine meiner Anwendungen mit SWT ein Master-Detail-Layout bauen.

Container, Inhalt, Sidebar und Teil1 sind Composite-Instanzen. Scrolled ist ein ScrolledComposite

Das gewünschte Layout ist so etwas wie:

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

Der Inhalt sollte den ganzen Raum horizontal und vertikal greifen, dass verfügbar ist.

Die Sidebar ist im Grunde ein Container für Teil1 und Scrolled, die von gleicher Höhe sein sollte.

gescrollt wird der Behälter für einen Verbundstoff mit einer dynamischen Anzahl der Unterelemente enthält, das in dem Inhalt-Komposit angeordnet ist. Da es eine große Variation der Anzahl der Unterelemente sein kann, sollte diese Composite-scrollbaren sein.

Ich habe jetzt diese auf folgende Weise umgesetzt:

  • Container haben ein Gridlayout mit 2 colums.

  • Innerhalb von, dass der Inhalt FILL_BOTH Verhalten und greift auch all horizontaler / vertikaler Raum hat.

  • Die Seitenleiste hat eine FillLayout (SWT.VERTICAL) und enthält die Teil1 und Scrolled Childs.

Problem: Wenn eine Menge von Elementen in die gescrollt Verbund setzen und das Layout überläuft gerade den verfügbaren Platz und es gibt kein Scrollen zur Verfügung, wo es sein sollte.

Wenn ich einen FillLayout (SWT.HORIZONTAL) für den Behälter des Verhalten wie gewünscht, da es ein Scrollen und alles „innerhalb Grenzen“.

Gibt es eine Möglichkeit, dieses Verhalten auch zu erreichen, wenn ein Gridlayout verwenden, weil ich den Inhalt möge die meisten Platz zu greifen.

An dem aktuellen Test SWT-Schnipsel:

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();
    }
}
War es hilfreich?

Lösung

scheint, wie ich die Lösung gefunden.

Es scheint der Fall zu sein, dass ein Composite-GRAB_EXCESS_VERTICAL nehmen muss verfügbare Breite begrenzt werden. Andernfalls wird die Komponente, die die bevorzugte Höhe zugeordnet, die die maximale Höhe auf einmal angezeigt werden.

Die folgenden Code-Änderungen haben den Trick:

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

sidebar.setLayoutData(new GridData(SWT.FILL,SWT.FILL,false,true));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top