在Windows任务栏上显示JDialog

or1*_*456 29 java swing jdialog

我正试图JDialog在Windows中显示一个.如何在我的Windows任务栏上显示JDialog(喜欢JFrame)?

Ing*_*gel 37

对话框本身不能有任务栏条目,但您可以构造一个没有任何可见效果的框架,并将其用作对话框的父级.然后它看起来像对话框有一个任务栏条目.以下代码显示了如何执行此操作:

class MyDialog extends JDialog {

    private static final List<Image> ICONS = Arrays.asList(
            new ImageIcon("icon_16.png").getImage(), 
            new ImageIcon("icon_32.png").getImage(),
            new ImageIcon("icon_64.png").getImage());

    MyDialog() {
        super(new DummyFrame("Name on task bar", ICONS));
    }

    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (!visible) {
            ((DummyFrame)getParent()).dispose();
        }
    }
}

class DummyFrame extends JFrame {
    DummyFrame(String title, List<? extends Image> iconImages) {
        super(title);
        setUndecorated(true);
        setVisible(true);
        setLocationRelativeTo(null);
        setIconImages(iconImages);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,有:如果有一个甚至在运行时使用的通用登录对话框(由于身份验证过期而重新提示输入凭据),那么如果开发人员希望 JDialog 能够在运行时模态化 -时间情况下,那么这种方法也有助于在第一次登录的情况下重用 JDialog 代码,因为没有什么可模态的。需要一些调整。 (2认同)

Lun*_*box 25

我找到了你问题的答案,因为我遇到了相反的问题.我在任务栏中显示了一个JDialog,我花了很长时间才弄清楚如何阻止它显示.事实证明,如果你传递一个null家长给的JDialog的构造函数,你的对话框将显示在任务栏.

JDialog dialog = new JDialog((Dialog)null);
Run Code Online (Sandbox Code Playgroud)

强制转换java.awt.Dialog是为了避免模糊的构造函数.

  • 或者,转换为“Window”。两者都有效。这似乎是预期的设计。这样做而不是定义你自己的类。 (2认同)
  • 为什么这不是最佳答案?更好更简单 (2认同)

Ell*_*ers 14

class MyDialog extends JDialog {
    MyDialog() {
        super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
}
Run Code Online (Sandbox Code Playgroud)


Hol*_*ger 5

当没有所有者时,对话框显示在任务栏中.Java 6中的AWT中添加了无主对话的可能性.不幸的是,此时,Swing类JDialog已经具有关于缺席或预定义​​行为的构造函数.null所有者,解决了以前Java版本的限制.由于兼容性问题,无法更改此行为.

因此,当您使用旧构造函数JDialog()和接受Frame参数的那些构造函数时,它们表现出与旧版本兼容的行为,Frame如果没有指定,则创建一个不可见的虚拟对象作为所有者.因此,以这种方式创建的Dialogs始终由Frame拥有.

这也包含在文档中:

注意:此构造函数不允许您创建无主JDialog.要创建无主JDialog,必须使用带有参数的JDialog(Window)JDialog(Dialog)构造函数null.

命名构造函数是Java 6的新增功能,因为在该版本中添加了另一个Dialog或者另一个或者一个对话框的可能性Window.由于这些新构造函数不必与先前版本兼容,因此它们可以支持无主对话框.这就是为什么这个答案中的解决方案有效的原因.

您也可以ModalityType此答案中使用构造函数,因为此构造函数也是新的两个Java 6并支持无主对话框.但是您不需要创建JDialog使用此构造函数的子类.