2009-02-06 78 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