2012-09-03 14 views
5

En un actionListener para un botón, nos gustaría crear un Formulario sobre la marcha.CodeNameOne Formulario creado dinámicamente, cómo "Volver"

Ej Algo así como

Button b = new Button("Clickme"); 
b.setActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Form f = new Form(); 
     Container c = new Container(); 
     ... 
     f.addComponent(c); 
     f.show(); 
    } 
}); 

que funciona muy bien ..... pero botón "atrás" no funcionará

¿Alguien sabe la forma correcta de poner en práctica una forma dinámica en un actionListener, o saltando a una forma predefinida a través del oyente de acción y acción?

Gracias

James

Respuesta

3

Se necesitan crear un comando de ida y asociarlo con la forma:

Command back = new Command("Back") { 
    public void actionPerformed(ActionEvent ev) { 
     // notice that when showing a previous form it is best to use showBack() so the 
     // transition runs in reverse 
     showPreviousForm(); 
    } 
}; 
f.setBackCommand(back); 

Esto se puede ver en la demo fregadero de la cocina que es totalmente codificado mano.

+1

Hola Shai, Gracias por responder. No teniendo mucha suerte. Tengo una lista en un formulario. Cada elemento de la lista tiene un botón, ese botón tiene un ActionListener que genera un formulario sobre la marcha. Puedo volver a la clase listrenderer, pero al llamar a getComponentForm() en ese punto se obtiene un NPE ... por lo que no estoy seguro de cómo obtener parentForm para establecer el parentForm.showBack(). – jamesarbrown

+1

Necesita generar el formulario anterior nuevamente, eso es exactamente lo que hacemos en el constructor de GUI. Alternativamente, puede mantener instancias de formulario en la RAM con las implicaciones obvias de costos de memoria. –

+0

Ok, no me di cuenta de que el objeto de formulario anterior se libera de la memoria cuando se genera uno nuevo. Tendremos un pensamiento sobre cómo reestructurar de forma cíclica. – jamesarbrown

0

También podría dar la forma como parámetro

chooseDB(c.getComponentForm()); 

private void chooseDB(final Form main) { 
    Form f = new Form("Choose a Database"); 
    ... 
    Command backCommand = new Command("Back") { 
     public void actionPerformed(ActionEvent ev) { 
      main.showBack(); 
     }}; 
    f.addCommand(backCommand); 
    f.setBackCommand(backCommand); 
    f.show(); 
} 

Así que para su ejemplo:

Button b = new Button("Clickme"); 
b.setActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Form f = new Form(); 
     Container c = new Container(); 
     Command backCommand = new Command("Settings") { 
     public void actionPerformed(ActionEvent ev) { 
      b.getComponentForm().showBack(); 
     }}; 
    f.addCommand(backCommand); 
    f.setBackCommand(backCommand); 
     f.addComponent(c); 
     f.show(); 
    } 
}); 

Shai, por favor corregir esto, si es que hiciera nada malo. Gracias.

Cuestiones relacionadas