problema con griffon

Hola q tal comunidad estoy teniendo un problema algo extraño con griffon y trata en que no puedo enviar argumentos a los closures del controller desde la vista lo intente desde un actionperformed y tambien desde las actions que maneja este marco , sin embargo si funcionan sin tener argumentos , en los closures hago pruebas con un println it y obtengo null , por el momento tengo que recurrir a la referencia view.dato dentro del closure del controlador.
- es decir (controller.miclosure ) funciona.
- y controller.miclosure('cadena') funciona pero con un println it dentro del closure imprime null.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Postea tu código

Así alguien te podría ayudar.

Imagen de julgo

no adjunte el codigo por que

no adjunte el codigo por que el problema lo escribi asumiendo que era tan literal que no era necesario pero aqui va el codigo y un poco mas de explicacion .
en la groovyConsole pruebo esto y me funciona

import groovy.swing.SwingBuilder
import static javax.swing.JFrame.EXIT_ON_CLOSE

def controller=new controlador();

new SwingBuilder().frame( title: 'ejemplo de groovy', size: [240,100], show: true,
          locationRelativeTo: null ) {
   
panel(border: emptyBorder(6)) {

gridLayout(rows:1, columns:2, hgap:6, vgap:6)

label("dale click al boton")
button(text:'dameclick',
actionPerformed:{controller.imprime('soyunString')})

}
}

class controlador {

def imprime={
println it
}

}

-por cierto tambien digamos de cierta forma "descubri" que si no enviamos argumentos al closure no es necesario las llaves {...} ni los parentesis(..) , pero en el ejemplo sin las llaves provocaria un error;
pero esto no es mi problema , el problema es como lograrlo en griffon donde invocar los closures sin argumentos me resulta valido ,pero el ejemplo anterior no.
- este es el codigo en griffon
// la vista view

package griffonapplication3

actions {
action(id: 'accion',
name: 'boton con id',
closure:{controller.imprime('soyunString')})
}

application(title:'ejemplo',pack:true, locationByPlatform:true) {

panel(border: emptyBorder(6)) {

gridLayout(rows:2, columns:2, hgap:6, vgap:6)

label("dale click al boton")
button(id:'bt',text:'dameclick',
actionPerformed:{controller.imprime('soyunString')})

label ("otro boton")
button accion

}
}

y el codigo del controlador

package griffonapplication3
import java.awt.event.ActionEvent

class GriffonApplication3Controller{
def view ;
def imprime = {
println it

}
}

el resultado de los eventos imprime null.
-encontre una solucion justo cuando escribia este post y lo hize a traves de un metodo y no un closure , incluso en el libro griffon in action en sus ejemplos utilizan closures no entiendo por que pasa esto pero aqui va la solucion

package miclase
application(title:'ejemplo',pack:true, locationByPlatform:true) {

panel(border: emptyBorder(6)) {

gridLayout(rows:1, columns:2, hgap:6, vgap:6)

label('click para invocar un metodo')
button(text:'dameclick',
actionPerformed:{controller.metodo('soyunString')})

}
}

codigo del controlador

package miclase
import java.awt.event.ActionEvent

class MiclaseController {
public void metodo(String texto){
println texto;
}
}

Imagen de Sr. Negativo

Tal vez esto te sirva

Imagen de ezamudio

closures vs métodos

La diferencia entre closures y métodos es que los closures pueden ser invocados con cualquier cantidad de argumentos mientras que la invocación a un método debe incluir tantos argumentos como parámetros tenga definido dicho método.

En cuanto a que no sea necesario incluir llaves si no incluyes parámetros: creo que estás un poco confundido en algunos conceptos. En tu primer ejemplo:

actionPerformed:{ controller.imprime('string') }

lo que estás haciendo es pasar a actionPerformed un closure dentro del cual invocas a controller.imprime.

Si le quitas las llaves:

actionPerformed:controller.imprime

Entonces estás pasando una referencia al closure imprime del objeto controller y ese closure se ejecutará cuando oprimas el botón, y recibirá los dos argumentos correspondientes a los parámetros de actionPerformed.

Imagen de julgo

si de acuerdo

-entiendo la diferencia entre los closures y metodos , aunque en cierto sentido un metodo podria recibir argumentos variables ,a pesar que no seria del todo exacto llamarlo asi, simularia esta caracteristica de los closures en la forma de invocarlos ; mas en el metodo mismo los argumentos son recibidos dentro de un array , en realidad el compilador nos ahorra el trabajo de crear el array con el tamaño de los argumentos en cada llamada por ejemplo :

public class variables {
   
  public void metodo(String...palabras){
    for (int i=0 ; i < palabras.length ; i++) {        
       System.out.println(palabras[i]);
     
    }  
  }  
   
   public static void main(String[] args) {
   variables miclase=new variables();
   miclase.metodo("java");
   System.out.println("llamar metodo con mas parametros");
   miclase.metodo("java","mexico");
   }
   
}

-

si olvide la referencia es por eso que

actionPerformed: controller.imprime()

provocaria un error a pesar de invocarlo sin parametros si es que no retorna un closure.

- en cuanto a griffon sigo sin entender por que no se comporta como en el primer ejemplo que publique ya que la vista tiene referencias tanto del controlador como del modelo.
-tampoco entendi la ultima parte de recibir los dos argumentos correspondientes a los parametros , supongo que por la prisa tal ves ya que mencionabas el closure dentro del actionPerformed = actionPerformed:controller.imprime

Imagen de ezamudio

versiones

Qué versión de Griffon usan en el libro y cuál estás usando tú? si es una más reciente, lee las notas de esa versión para ver qué cosas cambiaron.

Imagen de julgo

si pensé en las versiones

si pensé en las versiones pero es una característica tan básica que no crei que variara de versión en versión , será que estoy usando Windows jejeje , recuerdo que probe con dos versiones de griffon, me recuerda un problema que tuve con el apache derby que se instala junto a netbeans, por mas que configuraba firewall , variables de entorno, conexiones directas sin uso de netbeans, etc .y probaba no podía conectarme pero luego de eliminar por completo tanto netbeans como el jdk y volver instalarlo funcionaba perfecto, por ahora vere otros proyectos , de todas maneras mas adelante comenzare de cero y comentare que tal me fue.