2009-02-06 19 views
8

Estoy haciendo una GUI usando Swing de Jython. manejo de eventos parece ser particularmente elegante de Jython, acaba de establecerManejo de eventos con Jython & Swing

JButton("Push me", actionPerformed = nameOfFunctionToCall) 

Sin embargo, tratando de lo mismo dentro de una clase se pone difícil. Ingenuamente tratando

JButton("Push me", actionPerformed = nameOfMethodToCall) 

o

JButton("Push me", actionPerformed = nameOfMethodToCall(self)) 

de un método de interfaz gráfica de construcción de la clase no funciona, ya que el primer argumento de un método que se llama debe ser auto , con el fin de acceder a los miembros de datos de la clase, y por otro lado, no es posible pasar ningún argumento al controlador de eventos a través de la cola de eventos AWT. La única opción que parece estar usando lambda (tal como se aconseja en http://www.javalobby.org/articles/jython/) lo que resulta en algo como esto:

JButton("Push me", actionPerformed = lambda evt : ClassName.nameOfMethodToCall(self)) 

funciona, pero la elegancia se ha ido. Todo esto simplemente porque el método que se llama necesita una referencia de algún lado. ¿Hay alguna otra forma de evitar esto?

Respuesta

11
JButton("Push me", actionPerformed=self.nameOfMethodToCall) 

Aquí está un ejemplo modificado del artículo de usted citó:

from javax.swing import JButton, JFrame 

class MyFrame(JFrame): 
    def __init__(self): 
     JFrame.__init__(self, "Hello Jython") 
     button = JButton("Hello", actionPerformed=self.hello) 
     self.add(button) 

     self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 
     self.setSize(300, 300) 
     self.show() 

    def hello(self, event): 
     print "Hello, world!" 

if __name__=="__main__": 
    MyFrame() 
+0

Wow, eso fue simple! Gracias. Este enfoque parece enviar auto referencia y evento al método, y por lo tanto debe definirse como: def nameOfMethodToCall (self, evt) ¡lo cual está bien! –

+0

@JoonasPulakka: si quieres llamar a un método de clase simplemente utiliza 'classname.method' en lugar de' self.method' – ted