代码之家  ›  专栏  ›  技术社区  ›  jb.

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

  •  2
  • jb.  · 技术社区  · 17 年前

    我必须写一个小程序,它会弹出一个密码对话框。问题是,对话框设置为始终在顶部,但当用户单击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所指出的,我应该创建一个窗口,而不是模式对话框的父级(空、帧、小程序)。所以初始化父级的好方法是:

    parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
    
    4 回复  |  直到 17 年前
        1
  •  1
  •   shemnon    17 年前

    你用什么来为家长辩护?

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

    javax.swing.SwingUtilities.getWindowAncestor(theApplet)
    

    使用getWindowAncestor将跳过小程序父级(getroot(component)将返回小程序)。在至少一些版本的Java中,有一个相当于IE窗口的框架。YMMV。

        2
  •  1
  •   James A. N. Stauffer    17 年前

    制作一个后台线程,每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;
    }
    
        3
  •  1
  •   Joel Anair    17 年前

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

        4
  •  0
  •   noah    17 年前

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

    您需要的javascript如下:

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

    而Java将是:

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

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