Java 在Windows任务栏上显示JDialog

Java 在Windows任务栏上显示JDialog,java,swing,jdialog,Java,Swing,Jdialog,我试图在Windows中显示JDialog。如何在Windows任务栏上显示JDialog(如JFrame)?对话框本身不能有任务栏条目,但您可以构造一个没有任何可见效果的框架,并将其用作对话框的父级。然后,对话框将看起来有一个任务栏条目。以下代码显示了如何执行此操作: class MyDialog extends JDialog { private static final List<Image> ICONS = Arrays.asList( ne

我试图在Windows中显示
JDialog
。如何在Windows任务栏上显示
JDialog
(如
JFrame
)?

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

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);
    }
}
classmydialog扩展JDialog{
私有静态最终列表图标=Arrays.asList(
新建ImageIcon(“icon_16.png”).getImage(),
新建ImageIcon(“icon_32.png”).getImage(),
新的图像图标(“icon_64.png”).getImage();
MyDialog(){
超级(新DummyFrame(“任务栏上的名称”,图标));
}
公共void集合可见(布尔可见){
super.setVisible(可见);
如果(!可见){
((DummyFrame)getParent()).dispose();
}
}
}
类DummyFrame扩展了JFrame{

DummyFrame(String title,List我找到了你问题的答案,因为我遇到了相反的问题。我的任务栏上显示了一个JDialog,我花了很长时间才找到如何阻止它显示的方法。结果是如果你将
null
父对象传递给JDialog构造函数,你的对话框将显示在任务栏上

JDialog dialog = new JDialog((Dialog)null);

转换到
java.awt.Dialog
是为了避免模棱两可的构造函数。

对话框在没有所有者的情况下显示在任务栏中。在java 6中,awt中添加了无所有者对话框的可能性。不幸的是,此时Swing类
JDialog
已经有了具有关于abse的预定义行为的构造函数nt或
null
所有者,绕过以前Java版本的限制。由于兼容性问题,无法更改此行为

因此,当您使用旧的构造函数
JDialog()
和接受
Frame
参数的构造函数时,它们表现出与旧版本兼容的行为,如果未指定任何构造函数,则会创建一个不可见的伪
Frame
作为所有者。因此,以这种方式创建的对话框始终由框架所有

这也包含在以下内容中:

注意:此构造函数不允许您创建无主的
JDialog
。要创建无主的
JDialog
,必须使用
JDialog(窗口)
JDialog(对话框)
构造函数,参数为
null

命名构造函数对Java 6来说是新的,因为在该版本中还添加了另一个
对话框
窗口
拥有的对话框的可能性。由于这些新构造函数不必与以前的版本兼容,它们可以支持无主对话框。这就是为什么可以工作的原因


您也可以使用采用
ModalityType
的构造函数,就像as也是新的两个Java 6,并且支持无主对话框。但是您不需要创建
JDialog
的子类来使用此构造函数。

或者,强制转换到
窗口
。这两种方法都有效。这似乎是预期的设计。这样做,而不是定义ning您自己的类。为什么这不是最重要的答案?它更好,而且解释得更简单,但我借此机会深入了解了原因的细节…但是如果我们像这样使用,使用模态对话框是没有用的。实际上,有:如果有一个通用的登录对话框,即使在运行时也会使用(由于身份验证过期而重新提示凭据),那么,如果开发人员希望JDialog能够成为运行时案例的模态,那么这种方法也有助于在首次登录案例中,在没有模态的情况下重新使用JDialog代码。需要进行一些调整。
JDialog dialog = new JDialog((Dialog)null);