Подтвердить что ты не робот

Показать JDialog на панели задач

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

4b9b3361

Ответ 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 для использования этого конструктора.