如果用户单击IE窗格,则IE中的模式对话框将隐藏在IE后面

时间:2020-03-05 18:56:08  来源:igfitidea点击:

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

解决方案

回答

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

我们需要的JavaScript类似于:

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

而Java将是:

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

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

回答

创建一个后台线程,每2秒调用一次Dialog。
我们使用的代码(希望我能得到所有信息):

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;
}

回答

因为我不熟悉applet,所以这是一个黑暗的镜头,但是我们可以看一下IE的内置window.showModalDialog方法。相当容易使用。也许这与诺亚的建议相结合?

回答

我们为父母使用什么参数?

如果使用Applet的父级,则可能会更好。

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

使用getWindowAncestor将跳过小程序的父级(getRoot(component)将返回小程序)。至少在Java的某些版本中,存在一个与IE窗口等效的Frame。 YMMV。