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);
}
}
私は反対の問題を抱えていたので、あなたの質問に対する答えを見つけました。タスクバーに表示されていた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);
}
}
所有者がいない場合、ダイアログはタスクバーに表示されます。所有されていないダイアログを持つ可能性がJava6のAWTに追加されました。残念ながら、現時点では、SwingクラスJDialog
には、不在またはnull
の所有者に関して事前定義された動作を持つコンストラクタがすでにあり、以前のJavaバージョンの制限。互換性の懸念から、この動作は変更できません。
したがって、古いコンストラクタJDialog()
とFrame
引数を受け入れるコンストラクタを使用すると、古いバージョンと互換性のある動作を示し、所有者として非表示のダミーFrame
を作成します。何も指定されていません。したがって、この方法で作成されたダイアログは常にフレームによって所有されます。
これは ドキュメント にも組み込まれています:
注:このコンストラクターでは、所有されていない
JDialog
を作成することはできません。所有されていないJDialog
を作成するには、null
の引数を指定してJDialog(Window)
またはJDialog(Dialog)
コンストラクターを使用する必要があります。
名前付きコンストラクターはJava6の新機能であり、別のDialog
またはWindow
が所有するダイアログを持つ可能性もそのバージョンで追加されました。これらの新しいコンストラクターは以前のバージョンと互換性がある必要はないため、所有されていないダイアログをサポートできます。これが この回答の解決策 が機能する理由です。
この回答 のようにModalityType
を取るコンストラクタを使用することもできます。 このコンストラクタ も新しい2つのJava 6であり、所有されていないダイアログをサポートします。ただし、このコンストラクターを使用するためにJDialog
のサブクラスを作成する必要はありません。