在Windows任务栏上显示JDialog

时间:2011-11-04 08:18:59

标签: java swing jdialog

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

4 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:25)

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

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

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

答案 2 :(得分:13)

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

答案 3 :(得分:5)

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

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

这也包含在documentation

  

注意:此构造函数不允许您创建无主JDialog。要创建无主JDialog,您必须使用参数为JDialog(Window)的{​​{1}}或JDialog(Dialog)构造函数。

命名构造函数是Java 6的新增功能,因为在该版本中添加了另一个nullDialog拥有Dialog的可能性。由于这些新构造函数不必与先前版本兼容,因此它们可以支持无主对话框。这就是the solution in this answer有效的原因。

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