Показать JDialog на панели задач Windows - PullRequest
29 голосов
/ 04 ноября 2011

Я пытаюсь отобразить JDialog в Windows. Как мне показать JDialog (например, JFrame) на панели задач Windows?

Ответы [ 4 ]

37 голосов
/ 04 ноября 2011

Диалог сам по себе не может иметь запись панели задач, но вы можете создать фрейм, который не имеет видимого эффекта, и использовать его как родительский элемент для диалога. Тогда это будет выглядеть так, будто в диалоге есть панель задач. Следующий код показывает, как это сделать:

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);
    }
}
25 голосов
/ 27 августа 2014

Я нашел ответ на ваш вопрос, потому что у меня была противоположная проблема. У меня был JDialog, который показывался на панели задач, и мне понадобилось целое время, чтобы понять, как предотвратить его отображение. Получается , если вы передадите родительский элемент null в конструктор JDialog, ваш диалог отобразится на панели задач .

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

Приведение к java.awt.Dialog позволяет избежать неоднозначного конструктора.

13 голосов
/ 10 января 2013
class MyDialog extends JDialog {
    MyDialog() {
        super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
}
5 голосов
/ 07 сентября 2015

Диалоги отображаются на панели задач, когда они не имеют владельца.Возможность иметь неиспользуемые диалоги была добавлена ​​в AWT в Java 6. К сожалению, в это время класс Swing JDialog уже имел конструкторы с предопределенным поведением в отношении отсутствующих или null владельцев, обходя ограничения предыдущих версий Java,Это поведение нельзя изменить из-за проблем совместимости.

Таким образом, когда вы используете старые конструкторы JDialog() и те, которые принимают аргумент Frame, они демонстрируют поведение, совместимое со старыми версиями, создаваяневидимый манекен Frame как владелец, если ничего не указано.Поэтому созданные таким образом диалоги всегда принадлежат фрейму.

Это также включено в документацию :

ПРИМЕЧАНИЕ. Этот конструктор не позволяет вамсоздать неизвестную JDialog.Чтобы создать неизвестный JDialog, вы должны использовать конструктор JDialog(Window) или JDialog(Dialog) с аргументом null.

Именованные конструкторы являются новыми для Java 6, так как возможностьиметь диалог, принадлежащий другому Dialog или Window, также был добавлен в этой версии.Поскольку эти новые конструкторы не обязательно должны быть совместимы с предыдущей версией, они могут поддерживать неиспользуемые диалоги.По этой причине решение в этом ответе работает.

Вы также можете использовать конструктор, взяв ModalityType, как в , этот ответ , как этоКонструктор также является новым двумя Java 6 и поддерживает неизвестные диалоги.Но вам не нужно создавать подкласс JDialog, чтобы использовать этот конструктор.

...