Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Модальный диалог


Автор: TrivialCore 4.11.2004, 17:11
Суть проблемы следующая. Есть апплет, который при нажатии выполняет нечто, и это длится некоторое время, после чего в конце выскакивает модальный диалог, чтобы юзер подтвердил нажатием на "ОК". Так как операция длится дольше чем пару секунд, логично, что юзер на это время может переключиться на другое окно, чтобы не тратить время.

Но после того, как операция закончена, при переключении юзера на окно с апплетом модальный диалог не высвечивается, хотя он есть и (что свойственно модальным окнам) блокирует работу главного окна. В результате юзер не может сделать ничего и остается в глубоких непонятках.

Вопрос: как сделать, чтобы мой модальный диалог был видим при переключении/фокусе на браузер с апплетом?

Надеюсь, что понятно обьяснил. Если нет, могу еще раз постарат;ся.

Автор: TrivialCore 4.11.2004, 18:31
П.С. Какое же это веб-программирование? Если уж перемещать, то я бы переместил тему в GUI, т.к. это AWT/Swing-овая тема.

Автор: LSD 4.11.2004, 19:44
В обычном приложении эта проблема решается, установкой родительского фрейма. Правда как поступить с апплетом, не знаю.

Автор: Domestic Cat 4.11.2004, 21:08
Видимо никак, апплет веть в сандбоксе. Пока апплет это что-то делает, покажи юзеру чего-нибудь,
тот же модальный диалог, но с прогресс баром.

Автор: TrivialCore 5.11.2004, 15:51
Цитата(Domestic @ 4.11.2004, 21:08)
Пока апплет это что-то делает, покажи юзеру чего-нибудь,
тот же модальный диалог, но с прогресс баром.
Так ведь проблема именно в модальном диалоге. Т.е., если юзер переключается на другое окно, а потом обратно на браузер с апплетом, то модальное окно ему уже не показывается! Но оно все еще есть и блокирует действия юзера.

Цитата(LSD @ 4.11.2004, 19:44)
В обычном приложении эта проблема решается, установкой родительского фрейма

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

Автор: Alt 5.11.2004, 22:28
Можно попробовать так:

Код

public class Test extends Applet {

  public Frame getAppletFrame() {
       java.awt.Container container = this.getParent();
        while(container!=null){
            if(container instanceof Frame){
                return  (Frame)container;
            }
            container = container.getParent();
        }
        return null;
   }

}

Автор: polosatij 10.11.2004, 15:12
Цитата
Но после того, как операция закончена, при переключении юзера на окно с апплетом модальный диалог не высвечивается, хотя он есть и (что свойственно модальным окнам) блокирует работу главного окна. В результате юзер не может сделать ничего и остается в глубоких непонятках.


eto proishodit tol'ko v tom sluchae, esli u Dialog-a v konstruktore zadan true, to est'.. user OBJAZAN chto-libo sdelat' v Dialog-e..

Цитата
Вопрос: как сделать, чтобы мой модальный диалог был видим при переключении/фокусе на браузер с апплетом?


smile prosto: delaesh:

Код

 Canvas canvas = new Canvas(){
   public void paint(Graphics g){
     if (dialogDolzhenByt'Pokazan) {dialog.show();} //gde, boolean dialogDolzhenByt'Pokazan, dialog <- ssylka na tvoj klass Dialog
   }
 }



iiii.. smile
paint budet vsegda vyzyvat'sja, kogda user perekljuchaet okno (to est' delaet tvoj applett activnym)
udachi smile

Автор: TrivialCore 14.11.2004, 02:29
Звучит заманчиво, в понедельник попробую =)

Автор: TrivialCore 25.11.2004, 18:47
Вот только дело в том, что в самом апплете я не имею указателя на диалог, т.к. он создается вообще далеко от ГУИ - через интерфейс...

Автор: LSD 25.11.2004, 21:21
Цитата(TrivialCore @ 25.11.2004, 18:47)
Вот только дело в том, что в самом апплете я не имею указателя на диалог, т.к. он создается вообще далеко от ГУИ - через интерфейс...

Код
Frame.getFrames()

А там найдешь свой smile

Автор: TrivialCore 26.11.2004, 11:36
Проблема в том, что диалог - это не фрейм, а аналога для диалогов или окон я найти не могу...

Автор: AntonSaburov 26.11.2004, 12:55
Занятная задачка - надо поразмыслить на досуге. Ты только с форума не убегай быстро - вдруг решение аж через неделю придет smile

Автор: TrivialCore 26.11.2004, 13:16
Цитата(TrivialCore @ 5.11.2004, 15:51)
Конечно, можно положить на апплет фрейм, которого единственной целью будет быть родителем для диалога, но - коряво
Кстати, я решил сделать так, т.е. положить на апплет фрейм, чтобы он был родителем для всех диалогов, но!
Цитата
java.lang.IllegalArgumentException: adding a window to a container

=((

Добавлено @ 13:18
Цитата(AntonSaburov @ 26.11.2004, 12:55)
Ты только с форума не убегай быстро - вдруг решение аж через неделю придет
Я никуда убегать не собираюсь... хотя с этим приложением по идее сегодня бета-релиз выпустить уже договорился. Немного глупо с таким багом, но что ж поделаешь. Так что все еще жду вашей помощи smile

Автор: Domestic Cat 26.11.2004, 17:37
Цитата
Кстати, я решил сделать так, т.е. положить на апплет фрейм, чтобы он был родителем для всех диалогов, но!


а если фрейм никуда нe добавлять а просто держать ссылку на него?

Автор: TrivialCore 26.11.2004, 20:17
Дело в том, что это работает следующим образом (я так думаю):
Родитель для диалога нужен для того, чтобы определять, нужно ли высвечивать диалог. Когда все было спрятано, а потом родитель стал видимым (фокус на браузере), то также шлется сообщение диалогу - показаться. Если у диалога родителя нет, то соответственно и сообщение не шлется, диалог не отображается.
И также если родителем будет некий фрейм, которого нет на апплете, то и его отображение/неотображение не будет связано с видимостью апплета/браузера.

Я так себе это представляю. Если у кого есть более достоверное инфо, то милости прошу описать.

Автор: Domestic Cat 26.11.2004, 20:26
Но ведь к самому апплету можно добавить FocusListener:

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Component.html#addFocusListener(java.awt.event.FocusListener)

Автор: LSD 26.11.2004, 20:30
Цитата(TrivialCore @ 26.11.2004, 11:36)
Проблема в том, что диалог - это не фрейм, а аналога для диалогов или окон я найти не могу...

Ловкость рук и никакого мошенничевства smile
Код
public class Test
{  
 public static void main(String[] args)
 {
   JFrame mainFrame = new JFrame("Main application JFame");
   mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   mainFrame.show();
   mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
   Frame simpleFrame = new Frame("Simple Frame");
   simpleFrame.setSize(400 , 300);
   simpleFrame.setLocationRelativeTo(mainFrame);
   simpleFrame.show();
   JDialog dialog = new JDialog((Frame)null, false);
   dialog.show();

   Frame[] frames = Frame.getFrames();
   for(int i = 0; i < frames.length; i++)
     printWindowInfo(frames[i]);
 }
 
 private static void printWindowInfo(Window window)
 {
   System.out.println(window);
   Window[] windows = window.getOwnedWindows();
   for(int i = 0; i < windows.length; i++)
     printWindowInfo(windows[i]);
 }
}

Автор: Domestic Cat 26.11.2004, 20:53
Цитата
JFrame mainFrame = new JFrame("Main application JFame");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


Речь идет об апплетe пo-моему smile

Автор: LSD 26.11.2004, 21:25
Цитата(Domestic @ 26.11.2004, 20:53)
Речь идет об апплетe пo-моему

Там смысл был в том чтобы перебрать все существующие Window.

Автор: TrivialCore 28.11.2004, 02:33
LSD, в моем апплете нет ни одного Frame =(
Поэтому Frame.getFrames() не вернет ни одного...
Добавлено @ 02:36
Domestic Cat, вроде дошло, с фокус лиснером должно заработать, в понедельник сделаю =)

Автор: LSD 28.11.2004, 19:44
Цитата(TrivialCore @ 28.11.2004, 02:33)
LSD, в моем апплете нет ни одного Frame =(
Поэтому Frame.getFrames() не вернет ни одного...

Если есть диалог, то для него обязательно есть родительски фрейм. Даже если использовать new JDialog(), то все равно создается невидимый фрейм автоматом.

Автор: TrivialCore 29.11.2004, 18:55
Цитата(LSD @ 28.11.2004, 19:44)
Если есть диалог, то для него обязательно есть родительски фрейм.
А если я делаю new JDialog((Frame)null, ... .... ), то указываю родителя - null.



Цитата(Domestic @ 26.11.2004, 20:26)
Но ведь к самому апплету можно добавить FocusListener
Проблема оказалась такой: Когда висит модальное окно, пусть даже невидимое, апплету нельзя сделать фокус, он не доходит до апплета. Думаю, что то же самое будет и с другими ивентами.
Как тут быть?

Автор: Domestic Cat 29.11.2004, 19:13
Попробуй тогда через определенные промежуткi времени вызывat' нa диалогe show(), по таймеру например.

Автор: LSD 29.11.2004, 19:37
Цитата(TrivialCore @ 29.11.2004, 18:55)
А если я делаю new JDialog((Frame)null, ... .... ), то указываю родителя - null.

А ты мой код смотрел?

Автор: TrivialCore 29.11.2004, 19:43
Ну смотрел вроде. Только не тестировал, но раз ты тестировал, значит работает? Ну тогда - круто.

Просто решение от Alt-а, еще на первой странице, оказалось тоже тем, что надо. Метод возвращает некий Фрейм, в котором содержится апплет, и поэтому можно его установить как родителя =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)