Модальные диалоги в IE скрываются за IE, если пользователь нажимает на панель IE
-
09-06-2019 - |
Вопрос
Мне нужно написать апплет, который вызовет диалоговое окно с паролем.Проблема в том, что диалоговое окно настроено так, чтобы всегда быть сверху, но когда пользователь нажимает на окно 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]);
К сожалению, это означает отказ от всякой надежды на красивый модал.Удачи вам!