Я пытаюсь показать JDialog в окнах. Как показать JDialog (например, JFrame) на панели задач?
Показать JDialog на панели задач
Ответ 1
В диалоговом окне не может быть записи панели задач, но вы можете создать фрейм, который не имеет видимого эффекта, и использовать его в качестве родителя для диалога. Затем он будет выглядеть так, как будто в диалоговом окне есть панель задач. Следующий код показывает вам, как это сделать:
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);
}
}
Ответ 2
Я нашел ответ на ваш вопрос, потому что у меня была противоположная проблема. У меня был JDialog, который показывался на панели задач, и мне потребовалось бесконечно, чтобы понять, как предотвратить его показ. Выключается , если вы передаете родительский элемент null
конструктору JDialog, ваш диалог отобразится на панели задач.
JDialog dialog = new JDialog((Dialog)null);
Приведение в java.awt.Dialog
заключается в том, чтобы избежать двусмысленного конструктора.
Ответ 3
class MyDialog extends JDialog {
MyDialog() {
super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
Ответ 4
Диалоги отображаются на панели задач, когда у них нет владельца. Возможность использования неопубликованных Dialogs была добавлена в AWT на Java 6. К сожалению, в настоящее время класс Swing JDialog
уже имеет конструкторы с предопределенным поведением относительно отсутствующих или null
владельцев, работающих с ограничениями предыдущих версий Java, Это поведение не может быть изменено из-за проблем с совместимостью.
Таким образом, при использовании старых конструкторов JDialog()
и тех, кто принимает аргумент Frame
, они демонстрируют поведение, совместимое со старыми версиями, создавая невидимый манекен Frame
как владельца, если ни один не указан. Таким образом, созданные таким образом диалоговые окна всегда принадлежат кадру.
Это также включено в документация:
ПРИМЕЧАНИЕ. Этот конструктор не позволяет вам создать unowned
JDialog
. Чтобы создать незанятыйJDialog
, вы должны использовать конструкторJDialog(Window)
илиJDialog(Dialog)
с аргументомnull
.
Именованные конструкторы новы для Java 6, поскольку в этой версии была добавлена возможность иметь Dialog, принадлежащую другому Dialog
или Window
. Поскольку эти новые конструкторы не должны быть совместимы с предыдущей версией, они могут поддерживать неопубликованные диалоговые окна. Вот почему решение в этом ответе работает.
Вы также можете использовать конструктор, который принимает ModalityType
как этот ответ как this конструктор также является новым двумя Java 6 и поддерживает неработающие диалоги. Но вам не нужно создавать подкласс JDialog
для использования этого конструктора.