【问题标题】:Event handling with Jython & Swing使用 Jython 和 Swing 处理事件
【发布时间】:2010-10-05 22:59:04
【问题描述】:

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

JButton("Push me", actionPerformed = nameOfFunctionToCall)

但是,在课堂上尝试同样的事情变得很困难。天真地尝试

JButton("Push me", actionPerformed = nameOfMethodToCall)

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

类的 GUI 构造方法不起作用,因为要调用的方法的第一个参数应该是 self,以便访问类的数据成员,并且另一方面,不可能通过 AWT 事件队列将任何参数传递给事件处理程序。唯一的选择似乎是使用 lambda(如 http://www.javalobby.org/articles/jython/ 建议的那样),结果如下:

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

它有效,但优雅已经消失了。这一切只是因为被调用的方法需要来自某个地方的 self 引用。有没有其他办法解决这个问题?

【问题讨论】:

    标签: java python user-interface swing jython


    【解决方案1】:
    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()
    

    【讨论】:

    • 哇,这很简单!谢谢。这种方法似乎将自我引用和事件都发送到该方法,因此需要将其定义为: def nameOfMethodToCall(self, evt) 这很好!
    • @JoonasPulakka :如果你想调用一个类方法,只需使用classname.method 而不是self.method
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多