# SWT (JFace): bekomme das FormLayout nicht hin.



## Vatar (11. Mai 2005)

Moin Moin.
Also zuerst mal, ich habe schon mal ein kleines ChatProgramm mit dem SWT geschrieben und habe in diesem auch das FormLayout erfolgreich eingesetzt (leider hab ich das Proggi nicht mehr :-(  ).

Jetzt wollte ich halt mal ein wenig mit JFace rumspielen. Benutze ich kein Layout (also setLayout(null) ) und positioniere meine Komponenten selbst passt alles. sobald ich einen LayoutManager verwende wird mir nur noch das Objekt angezeigt welches ich zuerst hinzugefügt habe (belegt dann die gesammte Fenstergröße). Setzte ich das FormLayout für meine Composite so zeigt er gar keine Komponenten mehr an und zerschießt zu allem Überfluss auch noch meine Menu- und Status-Leiste (vorher waren die immer schön oben und unten am Fenster angebracht).

und nun ein wenig Code:

```
public class VersataQuerySearcher extends ApplicationWindow {
    
    private ExitAction exitAction = new ExitAction( this );
    
    private Composite controlComposite;
    private Composite treeComposite;
    
    private Label pathToQueriesLabel;
    private Text pathToQueriesText;
    private Button searchDirectory;
    private Button start;
    private TreeViewer tree;    
    
    public VersataQuerySearcher (){
        super(null);
        addMenuBar();
        addToolBar(SWT.FLAT |SWT.WRAP);
        addStatusLine();
    }// end Constructor
    
    
    /**
     * overriden
     * @see ApplicationWindow#configureShell(org.eclipse.swt.widgets.Shell)
     */
    public void configureShell(Shell shell){
        super.configureShell( shell );
        shell.setText( "VersataQuerySearcher" );
        shell.setImage(new Image(shell.getDisplay(), "./ressources/titleImage.gif"));
    }// endmethod
    
    
    /**
     * overriden
     * @see Window#initializeBounds()
     */
    public void initializeBounds(){
        getShell().setSize( 640, 480 );
        getShell().setLocation( 100, 100 ); 
    }// endmethod
    
    /**
     * overriden
     * @see ApplicationWindow#createMenuManager()
     */
    protected MenuManager createMenuManager () {
        MenuManager menuManager = new MenuManager();
        MenuManager fileMenu = new MenuManager ("&File");
        fileMenu.add( exitAction );
        
        menuManager.add( fileMenu );
        return menuManager;
    }// endmethod
    
    
    /**
     * overriden
     * @see ApplicationWindow#createToolBarManager(int)
     */
    protected ToolBarManager createToolBarManager ( int style ){
        ToolBarManager toolBar = new ToolBarManager( style );
        return toolBar;
    }// endmethod
    
    
    /**
     * Creates the visual Contents.
     * @see Window#createContents(org.eclipse.swt.widgets.Composite)
     */
    protected Control createContents(Composite parent){
//        controlComposite = new Composite( parent, SWT.NONE );
//        controlComposite.setLayout(new FormLayout());
        parent.setLayout(new FormLayout());
        
        pathToQueriesLabel = new Label (parent, SWT.FLAT);
        pathToQueriesLabel.setText("Pfad zum Versata-Query-Verzeichnis");
//        pathToQueriesLabel.setBounds(10, 10, 100, 30);
        
        pathToQueriesText = new Text(parent, SWT.SINGLE | SWT.BORDER);
//        pathToQueriesText.setBounds(10, 50, 100, 30);
        
        searchDirectory = new Button(parent, SWT.PUSH);
        searchDirectory.setText("Durchsuchen...");
//        searchDirectory.setBounds(120, 50, 100, 30);
        
        start = new Button(parent, SWT.PUSH);
        start.setText("Start");
//        start.setBounds(10, 100, 50, 30);

        doLayout();
        
        setStatus("Application started");
        return parent;
    }// endmethod
    
    
    /** just lLayout */
    private void doLayout(){
        FormData formData = new FormData();

        formData.top = new FormAttachment(0, 10);
        formData.left = new FormAttachment(0, 10);
        formData.width = 150;
        formData.height = 30;
        pathToQueriesLabel.setLayoutData(formData);
        
        formData.top = new FormAttachment(pathToQueriesLabel, 10);
        formData.left = new FormAttachment(0, 10);
        formData.width = 100;
        formData.height = 30;
        pathToQueriesText.setLayoutData(formData);
        
        formData.left = new FormAttachment(pathToQueriesText, 10);
        formData.width = 100;
        formData.height = 30;
        searchDirectory.setLayoutData(formData);
        
        formData.top = new FormAttachment(pathToQueriesText, 50);
        formData.width = 100;
        formData.height = 30;
        start.setLayoutData(formData);
        
    }// endmethod
    
    
    
    
    public static void main ( String [] args ){
        VersataQuerySearcher window =new VersataQuerySearcher();
        /* Sorgt dafür, dass die Zeile nach open() erst ausgeführt wird,
         * wenn das Fenster vom Benutzer geschlossen wurde. */
        window.setBlockOnOpen(true);
        window.open();
        // Ressourcen freigeben
        Display.getCurrent().dispose();
    }// endmethod main
    
    
}// end Class
```

Ich hatte beim layouten schon mehrer FormAttachements ausprobiert.

Ich hoffe es kann mir jemand helfen, auch bei Tutorials trat dieses Problem auf.
thx


----------



## ronny (11. Mai 2005)

hmmmm, erstelle mal in der createContents(...) Methode
ein Composite, auf den du das layout legst und dann 
fügst du dem Composite alle widgets hinzu, die du brauchst....

das parent.setlayout(..) nimmst du raus...

am ende gibts du nicht parent zurück, sondern das composite...  :wink:


----------



## Vatar (11. Mai 2005)

Das hatte ich ganz am Anfang auch (da ich eigentlich sowieso zwei Composites benutzen wollte), aber da hat er auch nix angezeigt.

Du meinst ungefähr so:

```
protected Control createContents(Composite parent){
        controlComposite = new Composite( parent, SWT.NONE );
        controlComposite.setLayout(new FormLayout());
        
        pathToQueriesLabel = new Label (controlComposite, SWT.FLAT);
        pathToQueriesLabel.setText("Pfad zum Versata-Query-Verzeichnis");

        pathToQueriesText = new Text(controlComposite, SWT.SINGLE | SWT.BORDER);

        searchDirectory = new Button(controlComposite, SWT.PUSH);
        searchDirectory.setText("Durchsuchen...");

        start = new Button(controlComposite, SWT.PUSH);
        start.setText("Start");

        doLayout();
        
        setStatus("Application started");
        return controlComposite;
    }// endmethod
```

Da zeigt er das Fenster mit Menu und Status aber sonst nichts mehr.


----------



## ronny (11. Mai 2005)

so schauts schonmal ganz gut aus...

das anzeigeproblem liegt dann auf jedenfall bei deiner "layouterei"   

z. B. überknallst du jedesmal FormData.... das legst du nur
einmal an und nimmst das für alle widgets her....
das geht definitiv schonmal in die hose. Du musst für
jedes widget ein eigenes FormData anlegen!

naja, die layoutmanager sind etwas tricky... versuchs
vielleicht auch parallel (statt FormLayout) mal mit nem gridlayout... 
eventuell kommst du da am anfang besser zurecht..   :wink:


----------



## Vatar (11. Mai 2005)

DANKE.
Man sollte sich doch ab und an Objektorientierung und die dazugehörigen Zeiger erinnern


----------

