关于 java:如果用户单击 IE 窗格,IE 中的模态对话框将隐藏在 IE 后面

关于 java:如果用户单击 IE 窗格,IE 中的模态对话框将隐藏在 IE 后面

Modal dialogs in IE gets hidden behind IE if user clicks on IE pane

我必须编写一个显示密码对话框的小程序。问题是对话框设置为始终位于顶部,但是当用户单击 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]);

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


推荐阅读