2010-11-27 8 views
6

Mi ventana debe permitir dos tipos diferentes de diseños (es un ejemplo simple para ilustrar mejor), p.¿Cómo cambiar el padre de los componentes con SWT?

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

y

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

donde el usuario puede cambiar entre ambos, por ejemplo, usando un elemento de menú.

Con SWT debe proporcionar el padre al crear un componente. Pero necesitaremos (1) reutilizar el componente y (2) colocarlos en un elemento primario diferente (similar a los marcos de acoplamiento). ¿Cómo es esto posible con SWT?

Respuesta

7

Simplemente puede hacer esto cambiando el componente de un elemento primario.

setParent() cambia el elemento primario del control, si el sistema operativo subyacente lo admite. Entonces puede layout() el compuesto para que aparezcan los cambios.

Digamos que tiene tres controles:

  • Un compuesto c1 que contiene controles verticales
  • Un compuesto c2 que contiene controles horizontales
  • Una etiqueta lbl
  • Un botón btn

Aquí es el código:

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

¿Sabe si la configuración del elemento principal es compatible con Windows, OS X y Linux/GTK? – Mot

+0

No; Solo he probado esto en Vista. Puedo verificar esto en la oficina el lunes. –

+0

Lo he probado en Linux y funciona (suponiendo que GTK + está instalado, que es el predeterminado en Ubuntu/Kubuntu/Xubuntu). –

Cuestiones relacionadas