2009-02-06 65 views
8

我使用Jython中的Swing来制作GUI。 Jython的事件处理似乎特别优雅,只需设置使用Jython和Swing处理事件

JButton("Push me", actionPerformed = nameOfFunctionToCall) 

但是,在类中尝试同一件事变得困难。天真地试图

JButton("Push me", actionPerformed = nameOfMethodToCall) 

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

从类不工作的GUI的施工方法,因为方法的第一个参数被称为应自我,为了访问类的数据成员,另一方面,不可能通过AWT事件队列将任何参数传递给事件处理程序。唯一的选择似乎是使用lambda(截至http://www.javalobby.org/articles/jython/决定),导致这样的事情:

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

它的工作原理,但优雅的走了。所有这些仅仅是因为被调用的方法需要从某个地方引用self。有没有其他解决方法?

回答

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

下面是你所引用的文章修改的例子:

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

哇,这是简单的!谢谢。这种方法似乎将自我参照和事件都发送给方法,因此需要将其定义为: def nameOfMethodToCall(self,evt) 这很好! – 2009-02-07 08:56:32