如果用户点击IE窗格,IE中的modal dialog将隐藏在IE后面

我必须编写一个带有密码对话框的applet。 问题是对话框总是在顶部,但是当用户点击IE窗口时,对话框仍隐藏在IE窗口后面。 并且由于对话框是模态的并且保存所有 IE线程,因此IE窗格不会刷新,并且对话框窗口仍然绘制在IE之上(但不刷新)。 这种行为使用户感到困惑(他们看到 IE上面的对话框,但看起来它已被绞死,因为它没有刷新)。

所以我需要一种方法来保持对话在所有事情之上。 但是这个问题的任何其他解决方案都会很好。

这是代码:

PassDialog dialog = new PassDialog(parent); /* do some non gui related initialization */ dialog.pack(); dialog.setLocationRelativeTo(null); dialog.setAlwaysOnTop(true); dialog.setVisible(true); 

解决方案:正如@shemnon所说,我应该创建一个窗口而不是(null,Frame,Applet)modal dialog的父级。 初始化父母的好方法是:

 parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet); 

你用什么参数为父母?

如果您使用Applet的父级,您可能会有更好的运气。

 javax.swing.SwingUtilities.getWindowAncestor(theApplet) 

使用getWindowAncestor将跳过applet parent(getRoot(component)将返回applet)。 在至少某些版本的Java中,有一个等同于IE窗口的Frame。 因人而异。

创建一个后台线程,每隔2秒在Dialog上调用toFront。 我们使用的代码(我希望我得到的一切):

 class TestClass { protected void toFrontTimer(JFrame frame) { try { bringToFrontTimer = new java.util.Timer(); bringToFrontTask = new BringToFrontTask(frame); bringToFrontTimer.schedule( bringToFrontTask, 300, 300); } catch (Throwable t) { t.printStackTrace(); } } class BringToFrontTask extends TimerTask { private Frame frame; public BringToFrontTask(Frame frame) { this.frame = frame; } public void run() { if(count < 2) { frame.toFront(); } else { cancel(); } count ++; } private int count = 0; } public void cleanup() { if(bringToFrontTask != null) { bringToFrontTask.cancel(); bringToFrontTask = null; } if(bringToFrontTimer != null) { bringToFrontTimer = null; } } java.util.Timer bringToFrontTimer = null; java.util.TimerTask bringToFrontTask = null; } 

这是一个黑暗的镜头,因为我不熟悉applet,但你可以看看IE的内置window.showModalDialog方法。 它相当容易使用。 也许这与诺亚的建议相结合?

您可以尝试使用JavaScript集成从JavaScript启动模式(有关示例,请参阅http://www.raditha.com/java/mayscript.php )。

您需要的JavaScript将是:

 function getPassword() { return prompt("Enter Password"); } 

Java将是:

 password = jso.call("getPassword", new String[0]); 

不幸的是,这意味着放弃拥有漂亮模态的所有希望。 祝你好运!