Обработка событий с помощью Jython & Swing - PullRequest
8 голосов
/ 06 февраля 2009

Я делаю графический интерфейс с помощью Swing из Jython. Обработка событий выглядит особенно элегантно в Jython, просто установите

JButton("Push me", actionPerformed = nameOfFunctionToCall)

Однако, пробовать то же самое в классе становится сложно. Наивно пытаясь

JButton("Push me", actionPerformed = nameOfMethodToCall)

или

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

из GUI-метода построения класса не работает, потому что первый аргумент вызываемого метода должен быть self , чтобы получить доступ к данным-членам класса и с другой стороны, невозможно передать какие-либо аргументы обработчику событий через очередь событий AWT. Похоже, что единственной опцией является использование лямбды (как указано в http://www.javalobby.org/articles/jython/), что приводит к чему-то вроде этого:

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

Это работает, но элегантность исчезла. Все это только потому, что вызываемому методу требуется ссылка self откуда-то. Есть ли другой способ обойти это?

1 Ответ

11 голосов
/ 07 февраля 2009
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()
...