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

时间:2011-09-16 00:06:57

标签: java python swing user-interface jython

编辑:如果多个标签令人困惑,我正在使用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超出范围,因此它被清理并且必须关。事实上,这可能是我encountered previously同样问题的另一个症状。

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

以“正确的方式”做事,在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,这也没有效果。

1 个答案:

答案 0 :(得分:0)

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

sun.awt.AWTAutoShutdown是防止在使用工具包注册本机窗口对等项时关闭JVM的类。在调用addNotify()时注册任何组件。对于一个框架,这是在您致电setVisible(true)时完成的。

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

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