2

我正在使用来自 Jython 的 Swing,我发现 while System.exit()(from java.lang) orJFrame.setDefaultCloseOperation(EXIT_ON_CLOSE)工作正常,调用sys.exit()挂起。

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

这意味着如果 aActionListener被调用(例如单击 a 时JButton),AWT 的 Event Dispatching Thread 将被生成,并且调用sys.exit()将永远挂起,等待它退出。

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

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

4

1 回答 1

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())
于 2012-06-05T23:24:46.230 回答