如何在Java applet中打开模态对话框?

7

我想在Applet前显示一个模态对话框。

我的当前解决方案是获取根框架,如下所示:

Frame getMyParent() {
    Container parent = getParent();
    while (!(parent instanceof Frame)) {
        parent = ((Component)parent).getParent();
    }
    return (Frame)parent;
}

并创建如下对话框:

public OptionsDialog(MainApplet applet, boolean modal) {
    super(applet.getMyParent(), "options", modal);
    // ....

然而,通常情况下,这会使模态对话框显示在框架下方,尽管模态行为正常工作。

怎样才能解决这个问题呢?

最好是适用于Java 1.5及以上版本。

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
JDialog dialog = new JDialog(SwingUtilities.windowForComponent(this));
dialog.setModal(true);
dialog.setSize(200, 200);
dialog.setVisible(true);

感谢camickr。不幸的是,这需要1.6版本,而我只能支持Java 1.5(因为很多人仍在使用它)。对于没有澄清问题,我道歉并已编辑了问题。 - Nick
我不知道我发布的任何代码是否独特于1.6版本。 - camickr
我发现JDialog(Window)构造函数是1.6特定的:http://download.oracle.com/javase/6/docs/api/javax/swing/JDialog.html#JDialog(java.awt.Window) - Nick
好的,那么接受 Window 参数的构造函数是从 1.6 版本开始引入的,但是还有许多其他的构造函数可供使用。我猜你实际上正在使用 JFrame 作为 owner Window,所以只需将 Window 强制转换为 JFrame 即可。有一个构造函数接受 Frame 参数,而 JFrame 是 Frame 的扩展。 - camickr
感谢camickr。抱歉耽搁了。我尝试测试windowForComponent是否为JFrame,但没有成功“java.lang.ClassCastException: sun.plugin2.main.client.PluginEmbeddedFrame无法转换为javax.swing.JFrame”。 - Nick

3

Frame f = (Frame)SwingUtilities.getAncestorOfClass(Frame.class, parentWindow); new JDialog(f, true);

(来源:http://kb.trisugar.com/node/7613) 适用于 parentWindow = sun.plugin2.main.client.PluginEmbeddedFrame。


2

Use null insterad of applet.getMyParent()


嗯,使用null将会将所有者框架设置为SwingUtilities.getSharedOwnerFrame() - 我会进行测试,谢谢! - Nick
不幸的是,这并不能解决问题,我只测试了Chrome浏览器,它一直显示在页面下方。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,