web-dev-qa-db-ja.com

WindowsタスクバーにJDialogを表示する

WindowsでJDialogを表示しようとしています。 WindowsタスクバーにJDialogJFrameなど)を表示するにはどうすればよいですか?

29
or123456

ダイアログ自体にタスクバーエントリを含めることはできませんが、目に見える効果のないフレームを作成して、ダイアログの親として使用することはできます。次に、ダイアログにタスクバーエントリがあるように見えます。次のコードは、その方法を示しています。

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);
    }
}
37
Ingo Kegel

私は反対の問題を抱えていたので、あなたの質問に対する答えを見つけました。タスクバーに表示されていたJDialogがあり、表示されないようにする方法を見つけるのに永遠に時間がかかりました。 null親をJDialogコンストラクターに渡すと、ダイアログがタスクバーに表示されます

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

Java.awt.Dialogへのキャストは、あいまいなコンストラクターを回避するためのものです。

25
Lunchbox
class MyDialog extends JDialog {
    MyDialog() {
        super(null, Java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
}
13
Elliot Evers

所有者がいない場合、ダイアログはタスクバーに表示されます。所有されていないダイアログを持つ可能性がJava6のAWTに追加されました。残念ながら、現時点では、SwingクラスJDialogには、不在またはnullの所有者に関して事前定義された動作を持つコンストラクタがすでにあり、以前のJavaバージョンの制限。互換性の懸念から、この動作は変更できません。

したがって、古いコンストラクタJDialog()Frame引数を受け入れるコンストラクタを使用すると、古いバージョンと互換性のある動作を示し、所有者として非表示のダミーFrameを作成します。何も指定されていません。したがって、この方法で作成されたダイアログは常にフレームによって所有されます。

これは ドキュメント にも組み込まれています:

注:このコンストラクターでは、所有されていないJDialogを作成することはできません。所有されていないJDialogを作成するには、nullの引数を指定してJDialog(Window)またはJDialog(Dialog)コンストラクターを使用する必要があります。

名前付きコンストラクターはJava6の新機能であり、別のDialogまたはWindowが所有するダイアログを持つ可能性もそのバージョンで追加されました。これらの新しいコンストラクターは以前のバージョンと互換性がある必要はないため、所有されていないダイアログをサポートできます。これが この回答の解決策 が機能する理由です。

この回答 のようにModalityTypeを取るコンストラクタを使用することもできます。 このコンストラクタ も新しい2つのJava 6であり、所有されていないダイアログをサポートします。ただし、このコンストラクターを使用するためにJDialogのサブクラスを作成する必要はありません。

5
Holger