2010-11-27 7 views
6

Mein Fenster sollte zwei verschiedene Arten von Layouts erlauben (es ist ein einfaches Beispiel, um es besser zu veranschaulichen), z.Wie Eltern der Komponenten mit SWT ändern?

+-------------+-------------+-------------+ 
| Component 1 | Component 2 | Component 3 | 
|    |    |    | 
|    |    |    | 
|    |    |    | 
|    |    |    | 
+-------------+-------------+-------------+ 

und

+-------------+---------------------------+ 
| Component 1 | Component 2    | 
|    |       | 
|    +---------------------------+ 
|    | Component 3    | 
|    |       | 
+-------------+---------------------------+ 

wo der Benutzer zwischen den beiden umschalten kann, beispielsweise ein Menüpunkt.

Mit SWT müssen Sie das übergeordnete Element angeben, wenn Sie eine Komponente erstellen. Aber wir müssen (1) die Komponente wiederverwenden und (2) sie in einem anderen Elternteil platzieren (ähnlich wie Docking-Frameworks). Wie ist das mit SWT möglich?

Antwort

7

Sie können dies einfach tun, indem Sie das übergeordnete Element einer Komponente ändern.

setParent() ändert das übergeordnete Element des Steuerelements, , wenn das zugrunde liegende Betriebssystem es unterstützt. Dann können Sie layout() das Composite so die Änderungen erscheinen.

Sagen Sie bitte drei Kontrollen haben:

  • Verbund c1 vertikale Kontrollen enthalten
  • Verbund c2 enthält horizontale Kontrollen
  • Ein Etikett lbl
  • A Taste btn

Hier der Code:

public class ControlSwitcher { 
    public static void main(String[] args) { 
     Display display = new Display(); 
     final Shell shell = new Shell(display); 
     GridLayout gl = new GridLayout(); 
     gl.marginWidth = gl.marginHeight = 20; 
     shell.setLayout(gl); 

     final Composite c1 = new Composite(shell, SWT.NONE); 
     c1.setBackground(new Color(display, 255, 160, 160)); 
     RowLayout layout = new RowLayout(SWT.VERTICAL); 
     c1.setLayout(layout); 

     final Composite c2 = new Composite(c1, SWT.NONE); 
     c2.setBackground(new Color(display, 160, 255, 160)); 
     c2.setLayout(new RowLayout()); 

     final Label lbl = new Label(c2, SWT.NORMAL); 
     lbl.setText("Hello world"); 

     final Button btn = new Button(c2, SWT.PUSH); 
     btn.setText("Switch"); 
     btn.addSelectionListener(new SelectionListener() { 
      @Override 
      public void widgetSelected(SelectionEvent arg0) { 
       Composite target; 
       if (btn.getParent().equals(c2)) { 
        target = c1; 
       } else { 
        target = c2; 
       } 
       boolean success = btn.setParent(target); 
       if (success) { 
        target.pack(); 
        shell.pack(); 
       } else { 
        throw new RuntimeException("Not supported by this platform"); 
       } 
      } 

      @Override 
      public void widgetDefaultSelected(SelectionEvent arg0) { 
      } 
     }); 

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

Wissen Sie, ob die Einstellung der Eltern unter Windows, OS X und Linux/GTK unterstützt wird? – Mot

+0

Nein; Ich habe das nur auf Vista getestet. Das kann ich am Montag im Büro überprüfen. –

+0

Ich habe es auf Linux getestet und es funktioniert (vorausgesetzt, GTK + ist installiert, das ist standardmäßig auf Ubuntu/Kubuntu/Xubuntu). –

Verwandte Themen