Модальные диалоги в IE скрываются за IE, если пользователь нажимает на панель IE

StackOverflow https://stackoverflow.com/questions/73000

Вопрос

Мне нужно написать апплет, который вызовет диалоговое окно с паролем.Проблема в том, что диалоговое окно настроено так, чтобы всегда быть сверху, но когда пользователь нажимает на окно IE, диалоговое окно, тем не менее, скрывается за окном IE.И поскольку dialog является модальным и содержит ВСЕ Потоки IE Панель IE не обновляется, и диалоговое окно по-прежнему отображается поверх IE (но не обновляется).Такое поведение сбивает пользователей с толку (они видишь диалоговое окно поверх IE, но похоже, что оно зависло, так как оно не обновляется).

Поэтому мне нужен способ держать этот диалог в курсе всего.Но любое другое решение этой проблемы было бы неплохим.

Вот код:

        PassDialog dialog = new PassDialog(parent);
        /* do some non gui related initialization */
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setAlwaysOnTop(true);
        dialog.setVisible(true);

Разрешение:Как отметил @shemnon, я должен создать окно вместо (null, Фрейм, Апплет) родительского модального диалога.Таким хорошим способом инициализации parent было:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);
Это было полезно?

Решение

Какой аргумент вы используете для родительского элемента?

Возможно, вам повезет больше, если вы будете использовать родительский элемент апплета.

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

Использование getWindowAncestor пропустит родителей апплета (getRoot(компонент) вернет апплеты).По крайней мере, в некоторых версиях Java существовал фрейм, который был эквивалентен окну IE.ИММВ.

Другие советы

Создайте фоновый поток, который вызывает toFront в диалоговом окне каждые 2 секунды.Код, который мы используем (надеюсь, у меня все получилось):

class TestClass {
protected void toFrontTimer(JFrame frame) {
    try {
        bringToFrontTimer = new java.util.Timer();
        bringToFrontTask = new BringToFrontTask(frame);
        bringToFrontTimer.schedule( bringToFrontTask, 300, 300);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

class BringToFrontTask extends TimerTask {
    private Frame frame;
    public BringToFrontTask(Frame frame) {
        this.frame = frame;
    }
    public void run()
    {
        if(count < 2) {
            frame.toFront();
        } else {
            cancel();
        }
        count ++;
    }
    private int count = 0;
}

public void cleanup() {
    if(bringToFrontTask != null) {
        bringToFrontTask.cancel();
        bringToFrontTask = null;
    }
    if(bringToFrontTimer != null) {
        bringToFrontTimer = null;
    }
}

java.util.Timer bringToFrontTimer = null;
java.util.TimerTask bringToFrontTask = null;
}

Это попытка в темноте, поскольку я не знаком с апплетами, но вы могли бы взглянуть на встроенный в IE метод window.showModalDialog.Он довольно прост в использовании.Может быть, сочетание этого и предложения Ноя?

Вы могли бы попробовать запустить модал из JavaScript, используя интеграцию JavaScript (см. http://www.raditha.com/java/mayscript.php для примера).

JavaScript, который вам понадобится, будет чем-то вроде:

function getPassword() {
  return prompt("Enter Password");
}

И Java была бы:

password = jso.call("getPassword", new String[0]);

К сожалению, это означает отказ от всякой надежды на красивый модал.Удачи вам!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top