| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > данные из Jframe<->Jdialog и обра |
| Автор: Sibir 26.3.2012, 20:30 | ||||||
| Всем привет, сразу перейду к делу. Есть класс ShowConfigSubFrame extends JFrame
класс DVOwin extends javax.swing.JDialog
вот в чем вопрос у меня есть основной класс ShowConfigSubFrame extends JFrame, он же реализует main и в нем же выводятся все данные, так же с него начинается как вы поняли загрузка. Так вот при нажатии кнопки в ShowConfigSubFrame определены данные передаются в конструкторе для DVOwin, он так же имеет некоторые элементы вода с клавиатуры и так же в DVOwin проводятся некоторые вычисления. После всех операций надо вернуть получены данные обратно в ShowConfigSubFrame в public void tttttt(String stp), но в чем вопрос как.... если вызвать такой метод ShowConfigSubFrame scsf = new ShowConfigSubFrame(); scsf.ttttt(String stp) в DVOwin, то так получится не правильно, так как класс ShowConfigSubFrame уже загружен и этот метод вызавит конструктор по умолчанию и переопределит все переменные и появится новое Jframe ShowConfigSubFrame, перегрузить конструктор ShowConfigSubFrame(String st), то же не вариант так как переменные та же переопределяется. знаю что в классе ShowConfigSubFrame можно было сделать так:
но охота сделать так как показано выше, так как таких диологовых окон у меня будет не одно а несколько и в одно у меня будет ни один слушатель событий. (переопределяется - каждый вызванный конструктор определяет для себя свои переменные, и если конструктор по умолчанию уже вызван и выделил память для переменных, то перезагруженный конструктор определит свои переменные, это я так понимаю, может и ошибаюсь...) вопрос как передать данные в основной класс ????? к коду сильно не придирайтесь, он в качестве примере. И при разъяснении можно привести маленький пример для более лучшего понимания. |
| Автор: Sibir 27.3.2012, 13:05 | ||||
| Как я понял над этой темой не задумывались. Поэтому нашел ответ сам Singleton сейчас работает все как хотел в ShowConfigSubFrame сделал так:
а в классеDVOwin extends javax.swing.JDialog
|
| Автор: Mirkes 27.3.2012, 18:43 |
| Я в таких случаях не передавал данные в основной класс, а выставлял классу флаг, что данные можно забирать. Главный класс время от времени проверял свой флаг, и обнаружив готовность забирал. Если же речь идет о диалогах (модальных окнах) то сразу после открытия модального окна проаерялся способ его закрытия и если это кнопка Ок, то данные забирались у диалога. Слова "сразу после" означают, что поскольку диалог - модальное окно, то оператор, следующий за setVisible(true) выполнится только после закрытия диалога. |
| Автор: jk1 27.3.2012, 23:31 | ||
Это решение идет вразрез со всей архитектурой Swing. Тут либо Singleton, как уже сам догадался Sibir, либо Listener для уведомления заинтересованных компонентов, либо (и это самый простой вариант) передача в конструктор диалога ссылки на фрейм. Как только диалог сделает все, что требуется, он просто дернет у фрейма метод и передаст ему данные. |
| Автор: Mirkes 28.3.2012, 02:56 | ||||
Я описал два решения, которые я использовал. Вариант с флагом я использовал для диалога типа "прогресс бар", который отображал процес счета другим потоком и отчасти им (счетом) управлял. Возможно это и противоречит идеологии Swing, не берусь сказать. Для нормального модального диалога я использовал второй из описанных вариантов - основной класс забирал данные у диалога после закрытия. Это, по-моему, самое простое решение. И не нужно передавать ссылку на главный класс в диалог. Предложенный jk1 вариант со ссылкой тоже простой. Но мне не понятны его преимущества перед вариантом, в котором данные забирает сам главный класс, запустивший диалог. Разве что диалог запускается в отдельном потоке. |
| Автор: Sibir 28.3.2012, 05:29 |
| Listener для уведомления заинтересованных компонентов jk1 а можешь уточнить это высказывание или привести пример в моем случаи, Listener должен находится в DVOwin extends javax.swing.JDialog ????? |
| Автор: jk1 29.3.2012, 08:47 | ||||
Накидал небольшой пример с listener'ом для наглядности
Тут видно, как frame получает нотификацию о закрытии диалога. При её получении можно снять с диалога все необходимые данные. |
| Автор: Mirkes 29.3.2012, 13:17 | ||
Прошу прощения чт влезаю в обсуждение, но мне действительно интересно, почему неправилно поступать следующим образом:
Это кусок рабочего кода. paramExec вызывается из обработки события нажатия кнопки. В методе крутится цикл до тех пор пока пользователь не введет корректные данные или откажется от редактирования параметров. В чем недостаток, некорректность такого подхода? |
| Автор: Sibir 31.3.2012, 10:46 |
| Спасибо |