Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JOptionPane.showInternalOptionDialog, проблема с тридами 
V
    Опции темы
goodday1941
Дата 20.11.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



если опциональное окошко вызываеться не в мейн триде, то трид после отображения опционального окошка слипается, почему?

если например есть метод:

public void doSomesing(){
System.out.println(1);
 JOptionPane.showInternalOptionDialog(/*параметры*/);
System.out.println(2);
}

и мы его вызываем с другого трида, то в стектрейсе отрисуеться еденичка, а после работы с опциональной формой и ее закрытием, двоечка не отрисуеться :(

где моя ошибка?

PS. Все проверялось с помощью JConsole. 
PPS. Такая ситуация наблюдаеться только в Internal опциональных диалогах.


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
goodday1941
Дата 20.11.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



Вот пример который это демонстрирует:

Код

public class Test extends JFrame{

    public static void main(String [] args) {
        WorkspaceDesktop a = new WorkspaceDesktop();
        final Test gg = new Test();
        gg.setSize(200, 200);
        gg.setContentPane(a);
        gg.setVisible(true);

        Runnable runnable = new Runnable() {
            public void run() {
                doSomesing();
            }
            public void doSomesing  () {
                System.out.println(1);
                 JOptionPane.showInternalOptionDialog(gg.getContentPane(),
                "Test",
                "error",
                JOptionPane.YES_OPTION,
                JOptionPane.ERROR_MESSAGE,
                null,
                new String []{"Ok"},
                "Ok");
                System.out.println(2);
            }
        };
        new Thread(runnable).start();
    }
}


Добавлено через 3 минуты и 53 секунды
хотя и без создания трида не работает :(

как сделать так что бы вывелась последняя строка в методе?

Это сообщение отредактировал(а) goodday1941 - 20.11.2007, 19:07


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
fixxer
Дата 20.11.2007, 19:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 15
Всего: 27



Отучаемся работать со Swing из других потоков.

Код

public void doSomesing() {
                System.out.println(1);
                SwingUtilities.invokeLater(new Runnable() {

                    public void run() {
                        JOptionPane.showInternalOptionDialog(gg.getContentPane(),
                                "Test",
                                "error",
                                JOptionPane.YES_OPTION,
                                JOptionPane.ERROR_MESSAGE,
                                null,
                                new String[]{"Ok"},
                                "Ok");
                    }
                });

                System.out.println(2);
            }



--------------------
user posted image
PM MAIL ICQ   Вверх
fixxer
Дата 20.11.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 15
Всего: 27



Беру слова обратно. Не понял сначала проблему.
там скорее всего дело в том как делается модальность.
вызывается через рефлекшн приватный метод startLWModal класса Container.
но вызов stopLWModal я не нашел.

Это сообщение отредактировал(а) fixxer - 20.11.2007, 19:46


--------------------
user posted image
PM MAIL ICQ   Вверх
goodday1941
Дата 20.11.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



в Вашем примере тоже второй систем аут не сработает?

Добавлено через 10 минут и 33 секунды
так с систем аутами все пучком, да и в jconsol'e вроде зависшие триды не висят.. думаю все что мне нужно было этот вариант решает


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
COVD
Дата 20.11.2007, 21:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

Беру слова обратно


Это вы погорячились. Только в конструкции  SwingUtilities.invokeLater... это и работает. А обычные, не Internal, работают везде.
PM MAIL   Вверх
fixxer
Дата 20.11.2007, 22:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 15
Всего: 27



Да. Все понятно. JOptionPane.showInternal... безопасно вызывать только из EventDispatchThread. Вопрос лишь в том, хотим ли мы чтобы поток (не ЕventDispatchThread) приостановился до закрытия диалога или нет. Что меня и смутило.  В зависимости от этого нужно использовать либо invokeLater либо invokeAndWait.
Смотрите разницу:

Код

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class OptionPaneTest {
    
    public static void main(String[] args) {
        final JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new JButton(new AbstractAction("Thread will wait") {
            public void actionPerformed(ActionEvent e) {
                new Thread(new Runnable() {
                    public void run() {
                        System.out.println("before dialog");
                        try {
                            SwingUtilities.invokeAndWait(new Runnable() {
                                public void run() {
                                    JOptionPane.showInternalMessageDialog(f.getContentPane(), "Test");
                                }
                            });
                        } catch (InvocationTargetException ex) {
                            ex.printStackTrace();
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                        System.out.println("after dialog");
                    }
                }).start();
            }
        }), BorderLayout.NORTH);
        
        f.getContentPane().add(new JButton(new AbstractAction("Thread will not wait") {
            public void actionPerformed(ActionEvent e) {
                new Thread(new Runnable() {
                    public void run() {
                        System.out.println("before dialog");
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                JOptionPane.showInternalMessageDialog(f.getContentPane(), "Test");
                            }
                        });
                        System.out.println("after dialog");
                    }
                }).start();
            }
        }), BorderLayout.SOUTH);
        f.setBounds(100, 100, 640, 480);
        f.setVisible(true);
    }
}


Это сообщение отредактировал(а) fixxer - 20.11.2007, 22:12


--------------------
user posted image
PM MAIL ICQ   Вверх
goodday1941
Дата 20.11.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 709
Регистрация: 16.7.2006
Где: Украина, Киев

Репутация: 8
Всего: 9



супер smile только хотел задать вопрос, а что делать если нас интересует информация которая вернеться с OptionPanel, а тут уже и ответ есть smile


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.