为什么我的Swing窗口会在几秒钟后自动关闭?

编辑:如果多个标签混淆,我在Jython工作。

这是我的SSCCE :

from javax.swing import JFrame window = JFrame('Test', defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (800, 600)) window.visible = True 

窗口打开,在那里停留几秒钟,然后关闭。 到目前为止,我发现唯一的解决方案是添加while True: pass到最后,这似乎表明问题是window超出范围,因此它被清理并且必须关闭。 事实上,这可能是我之前遇到的同一问题的另一个症状。

但是,我不认为在无限循环中浪费周期是最好的解决方案。 我想我可以通过在每个循环上睡几秒钟来减少问题,但我仍然希望能够正确地解决这个问题。

以“正确的方式”做事,在EDT上创建窗口,给出完全相同的行为:

 from javax.swing import JFrame, SwingUtilities from java.lang import Runnable class Foo(Runnable): def run(self): window = JFrame('Test', defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (800, 600)) window.visible = True foo = Foo() SwingUtilities.invokeLater(foo) 

在以前的应用程序中,这不是一个问题,因为无论如何我还需要一个无限循环来监视其他任务(监视套接字等)。 但是,我当前的应用程序完全由用户输入驱动,所以在invokeLater()之后我不需要/想要任何东西。

更新:根据kingo的回答,我尝试实例化其中一个:

 class JFrameTest(JFrame): def addNotify(self): print 'In addNotify()' JFrame.addNotify(self) def removeNotify(self): print "In removeNotify()" JFrame.removeNotify(self) 

“在addNotify()中打印,但不是”在removeNotify()“中,窗口的行为相同。 为什么removeNotify()不会被调用?

另外,我尝试过window.setVisible(True)而不是window.visible = True ,这也没有效果。

我建议采用以下策略来了解有关该问题的更多信息:

sun.awt.AWTAutoShutdown是一个类,如果在工具箱中注册了本机窗口对sun.awt.AWTAutoShutdown则该类可以防止关闭JVM。 在调用addNotify()时注册任何组件。 对于一个帧,这是在调用setVisible(true)

对等体可以取消注册的唯一方法是,如果有人在对等体上调用dispose() 。 在JRE中对等体上调用dispose()的唯一地方是Component#removeNotify()

您可以在帧类中覆盖该方法并打印堆栈跟踪以查看发生的原因。