如果用户单击 IE 窗格,IE 中的模式对话框将隐藏在 IE 后面
-
09-06-2019 - |
题
我必须编写一个小程序来弹出密码对话框。问题是对话框设置为始终位于顶部,但当用户单击 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) 父窗口。初始化父级的好方法是:
parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
解决方案
你用什么论据来支持父母?
如果您使用 Applet 的父级,您可能会有更好的运气。
javax.swing.SwingUtilities.getWindowAncestor(theApplet)
使用 getWindowAncestor 将跳过小程序父级(getRoot(component) 将返回小程序)。至少在 Java 的某些版本中,有一个相当于 IE 窗口的 Frame。YMMV。
其他提示
创建一个后台线程,每 2 秒调用一次对话框上的 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;
}
这是一个盲目的尝试,因为我对小程序不熟悉,但你可以看一下 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]);
不幸的是,这意味着放弃拥有漂亮的模态的所有希望。祝你好运!
不隶属于 StackOverflow