Модальные диалоги в IE скрываются за IE, если пользователь нажимает на панель IE - PullRequest
2 голосов
/ 16 сентября 2008

Я должен написать апплет, который вызывает диалог пароля. Проблема в том, что диалоговое окно всегда должно быть сверху, но когда пользователь нажимает на окно IE, диалог все равно скрывается за окном IE. А поскольку диалоговое окно является модальным и содержит все потоки 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, Frame, Applet) родителя модального диалога. Итак, хороший способ инициализации родителя был:

parent = javax.swing.SwingUtilities.getWindowAncestor(theApplet);

Ответы [ 4 ]

1 голос
/ 18 сентября 2008

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

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

javax.swing.SwingUtilities.getWindowAncestor(theApplet)

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

1 голос
/ 16 сентября 2008

Создайте фоновый поток, который вызывает 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;
}
1 голос
/ 16 сентября 2008

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

0 голосов
/ 16 сентября 2008

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

JavaScript, который вам нужен, будет выглядеть примерно так:

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

И Java будет:

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

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

...