Platzreservierung bei Unsichtbarkeit vermeiden

klaus1985

Mitglied
hallo,
folgendes Problem habe ich: ein Loginfenster vom Typ TitleAreaDialog hat einen Text, den ich erst beim Klick auf einen Button "Options" anzeigen lassen will. Ich setze also in der Methode createDialogArea diesen Text mit text.setVisibility(false). Jetzt wird der Platz natürlich reserviert und ist grau. Ich will aber, dass die Buttons stattdessen weiter raufrücken und beim Klick auf "Options" runterrücken und der Text dann sichtbar wird.
Google konnte nicht helfen, vielleicht ja hier jemand. danke schon mal.
 
Hallo,

du kannst es z.B. durch das Setzen von LayoutData auf der Text Komponente erreichen:

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class DynamicTextShowingTest
{
  public static void main( String[] args )
  {
    Display display = new Display();
    final Shell shell = new Shell( display );
    shell.setSize( 500, 200 );
    shell.setLayout( new GridLayout() );

    Text area = new Text( shell, SWT.MULTI | SWT.BORDER );
    area.setLayoutData( new GridData( GridData.FILL, GridData.FILL, true, true ) );

    final Text text = new Text( shell, SWT.SINGLE | SWT.READ_ONLY );
    text.setText( "Das ist der Text, der erst erscheint, wenn man auf Button 'Options' klickt" );
    GridData gridData = new GridData( GridData.HORIZONTAL_ALIGN_CENTER );
    gridData.heightHint = 0;
    text.setLayoutData( gridData );

    Button button = new Button( shell, SWT.PUSH );
    button.setLayoutData( new GridData( GridData.CENTER, GridData.CENTER, false, false ) );
    button.setText( "Options" );
    button.addListener( SWT.Selection, new Listener()
    {
      public void handleEvent( Event event )
      {
        GridData gridData = ( GridData ) text.getLayoutData();
        gridData.heightHint = gridData.heightHint == 0 ? SWT.DEFAULT : 0;
        shell.layout();
      }
    } );

    shell.open();
    while ( !shell.isDisposed() )
    {
      if ( !display.readAndDispatch() )
      {
        display.sleep();
      }
    }
    display.dispose();
  }
}

Grüße
Vincent
 
Hallo,

wenn du den Border unbedingt haben willst, dann musst du das Setzen von LayoutData mit dem ursprünglichen setVisible() kombibieren:
(Zeilen 4 und 9 sind neu)
Java:
    ....
    final Text text = new Text( shell, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER );
    text.setText( "Das ist der Text, der erst erscheint, wenn man auf Button 'Options' klickt" );
    text.setVisible( false );
    ....
        ....
        GridData gridData = ( GridData ) text.getLayoutData();
        gridData.heightHint = gridData.heightHint == 0 ? SWT.DEFAULT : 0;
        text.setVisible( gridData.heightHint == SWT.DEFAULT );
        shell.layout();
        ....
    ....

Das Problem ist, dass man den Border bei einem Widget nicht mehr nachträglich ändern kann.

Grüße
Vincent
 

Neue Beiträge

Zurück