退出使用Swing的Jython应用程序

时间:2012-06-05 21:11:37

标签: multithreading jython

我正在使用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 ...

1 个答案:

答案 0 :(得分:0)

我认为你不需要多线程,你只需要确保窗口没有关闭,直到你想要。关闭窗口时,关闭系统:

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())