在Windows任务栏上显示JDialog

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

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

 class MyDialog extends JDialog { private static final List 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 iconImages) { super(title); setUndecorated(true); setVisible(true); setLocationRelativeTo(null); setIconImages(iconImages); } } 

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

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

java.awt.Dialog是为了避免使用含糊不清的构造函数。

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

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

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

这也包含在文档中 :

注意:此构造函数不允许您创建无主JDialog 。 要创建一个无主的JDialog ,必须使用参数为nullJDialog(Window)JDialog(Dialog)构造函数。

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

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