【问题标题】:Exiting a Jython application that uses Swing退出使用 Swing 的 Jython 应用程序
【发布时间】:2012-06-09 22:15:07
【问题描述】:

我正在使用来自 Jython 的 Swing,我发现虽然 System.exit()(来自 java.lang)或 JFrame.setDefaultCloseOperation(EXIT_ON_CLOSE) 工作正常,但调用 sys.exit() 会挂起。

显然,通过atexit.register注册了一个函数,该函数等待所有线程退出,正如Python所期望的那样(这实际上与Java不同)。

这意味着如果ActionListener 被调用(例如,当单击JButton 时),AWT 的事件调度线程将被生成,并且调用sys.exit() 将永远挂起,等待它退出。

这是一个示例:https://gist.github.com/2877919。关闭框架会退出程序,除非先单击按钮。

退出 Jython 应用程序的最佳方式是什么?使用EXIT_ON_CLOSESystem.exit() 将完全忽略atexit...

【问题讨论】:

    标签: multithreading jython


    【解决方案1】:

    我认为您不需要为此使用多线程,您只需要确保在您需要之前不会关闭窗口。当你关闭窗口时,你就关闭了系统:

    from javax.swing import JFrame, JButton, JOptionPane
    from java.awt.event import ActionListener, WindowAdapter
    import sys
    
    class Frame(JFrame, ActionListener):
    
        def __init__(self):
            self.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)
            button = JButton("Hello", actionCommand='button')
            button.addActionListener(self)
            self.getContentPane().add(button)
            self.pack()
            self.setResizable(False)
    
        def actionPerformed(self, event):
            print event.getActionCommand();
    
    
    class Adapter(WindowAdapter):
        def windowClosing(self, event):
            if JOptionPane.showConfirmDialog(None, "Wanna exit?","Jython Test", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION:
                sys.exit(0)
    
    if __name__ == '__main__':
        frame = Frame();
        frame.setVisible(True)
        frame.addWindowListener(Adapter())
    

    【讨论】:

    • 在您的代码中,主线程返回,它允许您在通过抛出 SystemExit 终止 EDT 时终止应用程序。问题是当主线程结束时(通过到达文件末尾),用atexit注册的函数被执行了……这不是我想要的……
    • 不仅如此,这个代码示例还违反了 Swing re the EDT 的第 1 条规则
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多