我必须编写一个显示密码对话框的小程序。问题是对话框设置为始终位于顶部,但是当用户单击 IE 窗口时,对话框仍然隐藏在 IE 窗口后面。并且由于对话框是模态的并且包含所有 IE 线程 IE 窗格不会刷新,并且对话框窗口仍然绘制在 IE 之上(但没有刷新)。这种行为让用户感到困惑(他们在 IE 顶部看到对话框,但看起来它已经挂起,因为它没有刷新)。
所以我需要一种方法来让该对话框位于所有内容之上。但是这个问题的任何其他解决方案都会很好。
代码如下:
1 2 3 4 5 6
| 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) 父级。初始化父级的好方法是:
1
| parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet); |
你对父母使用什么参数?
如果您使用 Applet 的父级,您的运气可能会更好。
1
| javax.swing.SwingUtilities.getWindowAncestor(theApplet) |
使用getWindowAncestor 将跳过applet 父级(getRoot(component) 将返回applet)。至少在某些 Java 版本中,有一个 Frame 相当于 IE 窗口。 YMMV.
由于我对小程序不熟悉,所以这是在黑暗中拍摄的,但你可以看看 IE 的内置 window.showModalDialog 方法。它相当容易使用。也许这和诺亚的建议结合在一起?
创建一个后台线程,每 2 秒在 Dialog 上调用 toFront。
我们使用的代码(我希望我得到了一切):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| 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;
} |
您可以尝试使用 JavaScript 集成从 JavaScript 启动模式(参见 http://www.raditha.com/java/mayscript.php 示例)。
您需要的 JavaScript 类似于:
1 2 3
| function getPassword() {
return prompt("Enter Password");
} |
Java 将是:
1
| password = jso.call("getPassword", new String[0]); |
不幸的是,这意味着放弃拥有漂亮模态的所有希望。祝你好运!