2

私は 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_CLOSEまたはを使用System.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 に答える