2

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

4 回答 4

1

创建一个后台线程,每 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;
}
于 2008-09-16T15:24:06.353 回答
1

由于我对小程序不熟悉,因此这是在黑暗中拍摄的,但是您可以看看 IE 的内置 window.showModalDialog 方法。它相当容易使用。也许这和诺亚的建议相结合?

于 2008-09-16T15:31:29.703 回答
1

你为父母使用什么论据?

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

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

使用 getWindowAncestor 将跳过 applet 父级(getRoot(component) 将返回 applet)。至少在某些 Java 版本中,有一个 Frame 相当于 IE 窗口。YMMV。

于 2008-09-18T16:01:56.573 回答
0

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

您需要的 JavaScript 类似于:

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

Java 将是:

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

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

于 2008-09-16T14:54:06.923 回答