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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодейстие окон приложения. 
V
    Опции темы
jvoid
Дата 22.1.2010, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

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



Привет всем. Обращаюсь к вам за помощью. Есть окно оно содержит набор полей JTextField которые заполняются значениями, или выпадающих меню значения которых выбираются, а потом при нажатии на кнопку введенные  данные о человеке сохраняются в базу:
Код

public class IndividualJFrame extends JFrame {
........
jButtonSave.setText("Сохранить");
            jButtonSave.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    individual.setFamilyUkrImen(JTextFieldFamily.getText());
                     City city = individual.getCity();
 //если город не установлен,появляется отдельное окно, в котором создается новый город  или выбирается существующий
                    if (city == null) {
                        city = new City();
                        individual.setCity(city);
// создаем JFrame редактирования улицы
                        new EditCity(city)
                                .setVisible(true);
                    }
// как остановить програму в этом месте до момента пока окно  EditCity не завершит работу????
// Нужно что б после закрытия дочернего диалогового окна приложение продолжало работать дальше с этого же места
// иначе дальше програма пытается сохранить individual, а город ещё неизвестен

                        if (street == null) {
                        street = new Street();
                        individual.setStreet(street);
// создаем JFrame редактирования города
                        new EditStreet(street )
                                .setVisible(true);
                    }
//Тоже самое ждем пока пльзователь сохранит в дочернем окне street, а потом код в основном окне продолжил выполнятся дальше
                    new IndividualDAO().saveOrUpdateIndividual(individual);

}

Но если в момент сохранения данные не полные их нужно дополнить, т.е создается новое окно и основному окну нужно дождаться завершения работы дочернего, а потом продолжить свою работу. Как это можно реализовать? 

Это сообщение отредактировал(а) jvoid - 22.1.2010, 12:36
PM MAIL   Вверх
jk1
Дата 22.1.2010, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Код

 //это ваше основное окно
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(100, 100));
        frame.addWindowListener(new WindowAdapter() {
            // этот метод будет вызван при попытке его закрытия            
            @Override
            public void windowClosing(WindowEvent e) {
                // это диалог для ввода еще не выбранных хначений
                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setSize(new Dimension(100, 100));
                dialog.setVisible(true);
                // когда он отрабатывает, он закрывается и окно вместе с ним
            }
        });
        frame.setVisible(true);



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
jvoid
Дата 22.1.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

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



jk1 
Не совсем то что нужно. Я дополнил свой код.
Есть основное окно, пользователь заполняет текстовые поля, потом нажимает "сохранить", программа проверила значение, если что то не так, вызывается диалоговое окно, пользователь изменяет значение, сохраняет, закрывает окно, проверяется следующее значение, создается следующее окно. А так как сейчас моя программа сразу создает ворох окон, где неправильные значения, потом не дожидаясь их закрытия и сохранения значений, пытается сохранить объект. 

Это сообщение отредактировал(а) jvoid - 22.1.2010, 12:29
PM MAIL   Вверх
jk1
Дата 22.1.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Цитата

// как остановить програму в этом месте до момента пока окно  EditCity не завершит работу????

Сделать окно EditCity не фреймом, а модальным диалогом. Тогда родительское окно будет ждать завершения действий диалога. Пример:
Код

public static void main(String[] args) {
        //это ваше основное окно
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(300, 100));
        JButton doSmth = new JButton("Сделать что-нибудь");
        doSmth.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("старт обработчика");
                // это диалог для ввода чего-нибудь
                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setSize(new Dimension(100, 100));
                dialog.setVisible(true);
                // Все, что дальше, будет выполнятся только после закрытия диалога
                System.out.println("еще какие-нибудь действия после закрытия диалога");
            }
        });
        frame.getContentPane().add(doSmth);
        frame.setVisible(true);
    }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
jvoid
Дата 30.1.2010, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

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



jk1 спасибо, жаль не могу плюсануть
работает, но немного странно
Код

// вызываемый диалог
public class EditCaseJDiaog extends JDialog {
public EditCaseJDiaog(final Family family, final JTextField parentJTextField, Frame onwer) {
        super(onwer);
        initialize();
jButtonSave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                family.setUkrImen(caseJPanel.jTextFieldUkrImen.getText());
                family.setRusImen(caseJPanel.jTextFieldRusImen.getText());
                new FamilyDAO().saveOrUpdateName(family);
                dispose();
            }
        });
}

Код

// родительское окно JFrame
EditCaseJDiaog  editCase = new EditCaseJDiaog(family1, JTextFieldFamily, IndividualJFrame.this);
                editCase.setModal(true);
                editCase.setVisible(true);
                individual.setFamily(family1);
                // следующая строка почему то вызывает ошибку
                JTextFieldFamily.setText(family1.getUkrImen());
                // Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification



Это сообщение отредактировал(а) jvoid - 30.1.2010, 08:46
PM MAIL   Вверх
jk1
Дата 30.1.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 75



Без кода проекта целиком сложно сказать, но есть подозрение, что это вызвано однопоточностью Swing'а как Toolkit.
Попробуйте вот такой workaround:
Код

SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JTextFieldFamily.setText(family1.getUkrImen());
                }
            });



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
jvoid
Дата 30.1.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 26.5.2009

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



Цитата

Без кода проекта целиком сложно сказать, но есть подозрение, что это вызвано однопоточностью Swing'а как Toolkit.

Проблема возникает  только при:
Код

editCase.setModal(true);

Код

Попробуйте вот такой workaround:

Ваш код решает проблему на 100%, благодарю.
Правда мне совсем не понятно почему... пойду читать про потоки.

Это сообщение отредактировал(а) jvoid - 30.1.2010, 19:20
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1128 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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