多个小程序 - stop()和destroy()

时间:2013-09-27 04:28:11

标签: java applet lifecycle

我有一个包含多个小程序的页面(是的,它已经过时了)。其中一个applet会覆盖stop方法,如下所示:

@Override public void stop() {

 System.out.println("Stop called!");

}

但是,当我这样做时,当我切换标签时,控制台中没有显示任何内容(是的,java控制台),或者做任何应该调用stop()的事情。覆盖destroy()也会出现同样的问题。但是,start()init()函数按预期工作。

我的applet扩展了另一个类,后者又扩展了JApplet。我这样做是为了让我的所有applet都能访问特定的函数(在这个中间类中定义)。这些applet还为重复性任务创建了其他线程,但我认为这不会影响生命周期方法。我不确定在这一点上看,焦点函数或其他类似的东西是否可能阻止生命周期方法执行,或者在一个页面上有多个applet会导致这些方法出现问题?先谢谢。

编辑:我在我的服务器上发布了一个SSCCE以显示此行为Click here to runHere to dowload sources,这是一个启动线程的简单applet,它调用父applet中打开JDialog的方法。您会注意到,在对话框打开时可以关闭浏览器选项卡(只要打开其他选项卡),IE10中就不会出现stop或destroy打印语句。最重要的是,JVM继续运行,Java控制台不会关闭。但是,如果在关闭浏览器窗口之前确认弹出窗口,则一切都按预期运行。

那么,问题是,如果有人在弹出窗口打开时关闭浏览器窗口,我该如何杀死额外的线程,以及弹出窗口本身?

3 个答案:

答案 0 :(得分:1)

提到的JDialog是使用JOptionPane创建的。引自javadoc

  

所有对话都是模态的

模态对话框有效地阻止小程序阻止小程序中的stopdestroy方法被调用。您可以简单地将对话框设为非模态

popup.setModal(false);

答案 1 :(得分:1)

下载并扩展Zip后,将2个源转换为SSCCE(根据定义,SSCCE是一个源文件),我在IE9中注意到了相同的行为。

在我看来,这是浏览器/ JVM交互错误的又一个例子。在FF中,用户无法关闭页面或在对话框打开时更改选项卡。这导致了一种我们所期望的行为,因为必须在关闭applet选项卡之前关闭对话框(或更改选项卡或关闭浏览器)。

在IE9(和10,根据您的报告),尽管对话框可见,但仍可访问该页面,从而导致所有问题。

不幸的是,我能想到的唯一解决办法,没有(工作)。有时,ComponentListener可以检测到必要的事件,但在这种情况下,关闭标签或更改标签时不会触发。

所以,我建议您在bug database搜索类似内容。如果您什么都没找到,请提出新的报告,看看甲骨文在这件事上要说些什么。如果它是一个bug并且他们认为这是IE的错误,他们可以用MS来接收它。

答案 2 :(得分:0)

  

我切换标签,或做任何应该调用stop()的事情。相同   覆盖destroy()会发生问题。但是,开始()   和init()函数按预期工作。

Life Cycle of an Applet Doc page says:

当用户离开页面时,例如,要转到另一个页面,浏览器会停止并销毁该小程序。小程序的状态不会保留。当用户返回页面时,浏览器会初始化并启动小程序的新实例。

所以是的,当我尝试更改正在运行applet的页面时,我得到了正确的结果,stop()destroy()方法被调用,stopping和{{1}得到印刷。如果按destroying表示您在打开的标签页中选择一个标签,则不会导致调用switching the tabstop()。但是,如果使用Netbeans / Eclipes直接从applet查看器运行JApplet,您将看到窗口状态更改(例如,图标化,规范化)将导致destroy()被调用。如果关闭JApplet查看器,将调用stop()

  

您会注意到,您可以在对话框打开时关闭浏览器选项卡(只要打开其他选项卡),IE10中就不会出现停止或销毁打印语句。

我已经用IE9进行了测试,因为我现在没有IE10,我注意到在IE9中不同于Firefox,JDialouge允许在打开的选项卡之间切换选项卡,但它既不允许浏览器也不包含applet的页面关闭destroy()它。所以它与IE10有关。您可以尝试使用javascript调用applet函数以强制它在acknowledging上退出。我不确定这一点,但正如我所提到的,我没有IE10。

  

最重要的是,JVM继续运行,Java控制台不会关闭。但是,如果在关闭浏览器窗口之前确认弹出窗口,则一切都按预期运行。

我在这里有点困惑。实际上,无论是Firefox还是IE9,我都经历过,在关闭包含JApplet的页面后,window close event最多需要2分钟时间才能退出自身jp2launcher.exe。同时,如果您重新打开包含applet的页面,它将立即启动而不会要求任何权限,因为它会在第一次加载时询问。