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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top