2008-09-16 25 views
2

我必须编写一个提供密码对话框的小程序。问题是,对话框始终设置为最高,但是当用户单击IE窗口对话框时,仍然隐藏在IE窗口后面。并且由于对话框是模态的,并且保持全部 IE线程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指出我应该做一个窗口,而不是(空,帧,小程序)模式对话框的父。到initlialize父母这么好的方法是:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet); 

回答

1

您对父母使用什么参数?

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

javax.swing.SwingUtilities.getWindowAncestor(theApplet) 

使用getWindowAncestor会跳过小程序父项(getRoot(component)将返回小程序)。至少在某些版本的Java中,有一个相当于IE窗口的框架。因人而异。

+0

好吧,我做了一些像JOptionPane.getRootFrame。我会明天看第一件事情。 – 2008-09-18 18:38:02

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]); 

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

1

设置后台线程每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; 
} 
+0

它对我有点蛮横的力量。但这是最简单的选择。 – 2008-09-16 17:24:52

1

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