2009-02-06 42 views
8

Tôi đang tạo GUI bằng cách sử dụng Swing từ Jython. Xử lý sự kiện dường như đặc biệt thanh lịch từ Jython, chỉ cần đặtXử lý sự kiện với Jython & Swing

JButton("Push me", actionPerformed = nameOfFunctionToCall) 

Tuy nhiên, việc thử cùng một thứ trong lớp sẽ trở nên khó khăn. Ngây thơ cố gắng

JButton("Push me", actionPerformed = nameOfMethodToCall) 

hoặc

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

từ một phương pháp GUI-xây dựng của lớp không hoạt động, vì đối số đầu tiên của một phương pháp được gọi là nên tự, để truy cập các thành viên dữ liệu của lớp, và mặt khác, không thể chuyển bất kỳ đối số nào cho trình xử lý sự kiện thông qua hàng đợi sự kiện AWT. Lựa chọn duy nhất dường như được sử dụng lambda (như khuyến cáo tại http://www.javalobby.org/articles/jython/) mà kết quả trong một cái gì đó như thế này:

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

Nó hoạt động, nhưng sự tinh tế đã biến mất. Tất cả điều này chỉ vì phương pháp được gọi là cần có một tham chiếu tự từ một nơi nào đó. Có cách nào khác xung quanh việc này không?

Trả lời

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

Dưới đây là một ví dụ sửa đổi từ các bài báo mà bạn trích dẫn:

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, đó là đơn giản! Cảm ơn. Cách tiếp cận này dường như gửi cả tham chiếu và sự kiện đến phương thức và do đó cần phải được xác định như sau: def nameOfMethodToCall (self, evt) . –

+0

@JoonasPulakka: Nếu bạn muốn gọi một phương thức lớp, chỉ cần sử dụng 'classname.method' thay vì' self.method' – ted

Các vấn đề liên quan