编辑:如果多个标签令人困惑,我正在使用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
,这也没有效果。
答案 0 :(得分:0)
我建议采用以下策略来了解有关该问题的更多信息:
sun.awt.AWTAutoShutdown
是防止在使用工具包注册本机窗口对等项时关闭JVM的类。在调用addNotify()
时注册任何组件。对于一个框架,这是在您致电setVisible(true)
时完成的。
对等方可以取消注册的唯一方法是,如果有人在对等方上调用dispose()
。 JRE中对等方调用的唯一位置dispose()
来自Component#removeNotify()
。
您可以在帧类中覆盖该方法并打印堆栈跟踪以查看发生的原因。