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


Автор: SID_M 12.3.2006, 13:19
Есть ли механизм получения данных от немодальной формы, т.е. от JFrame, которая создана в другом Thread.

Из главного окна я вызываю много новых, но нужно получить результаты их работы назад. Причем каждое новое окно создается в новом потоке.

Как мне быть?! smile

Желательно простенький пример. smile

Автор: LSD 12.3.2006, 13:33
Определи методы с помощью которых твои компоненты будут возвращать результаты и вызывай их.

Например можно задать такой интерфейс:
Код
public interface DataEditor<T>
{
  public boolean isEditingComplete();

  public T getData();
}

затем имплементируешь его своими фреймами. Когда хочешь получить данные, проверяешь что ввод данных закончен (isEditingComplete()) и если да, то получаешь их (getData()).

Автор: SID_M 12.3.2006, 13:40
Красиво. Вото только один вопрос в данном случае <T> - это по аналогии с С++ любой тип, который туда подставишь, правильно?
А вообще красиво... smile

А как быть с потоками? Новые окна, то создаются в разных потоках с основным...
Мож я туплю правда.

Автор: LSD 12.3.2006, 13:46
Цитата(SID_M @ 12.3.2006, 13:40 Найти цитируемый пост)
Красиво. Вото только один вопрос в данном случае <T> - это по аналогии с С++ любой тип, который туда подставишь, правильно?

Да, это generics, доступно начиная с JDK 1.5. Когда бедешь имплементировать пишешь так:
Код
public MyStringEditor extends .... implements DataEditor<String>
{
....
  public String getData()
  {
....
}

Автор: SID_M 12.3.2006, 13:47
А как быть с потоками? Новые окна, то создаются в разных потоках с основным...
Мож я туплю правда.

Автор: powerOn 12.3.2006, 15:15
Предположим есть у тебя главная форма, которая просто в своем заголовке отображает число, и больше ничего....
И есть на главной форме кнопка, которая открывает в новом потоке другую новую форму с полем ввода, куда ты должен
ввести число. Введешь число ты в появившуюся форму, закроешь её, и должно это число появиться в заголовке главной формы. Это простейший пример передачи данных от одной формы к другой.

Так вот, чтобы это реализовать нужно сделать так, чтобы форма для ввода числа знала о существовании главной формы и в момент своего закрытия вызывала метод главной формы для установки числа.
Передавай ссылку на главную форму дочерним окнам, и пусть дочернии окна вызавают методы главно формы.
Только не забудь о синхронизиронизации.

Автор: batigoal 12.3.2006, 19:05
Цитата(MoonCat @ 12.3.2006, 16:15 Найти цитируемый пост)
...о синхронизиронизации.

От сказал так сказал... smile

Автор: DarkDS 12.3.2006, 19:29
Цитата(SID_M @ 12.3.2006, 13:47 Найти цитируемый пост)
А как быть с потоками? Новые окна, то создаются в разных потоках с основным...
Мож я туплю правда.

Тут есть 2 варианта.
1. Создать евент листенер со определенным эвентом и главное окно наследовать от него.
При окончании работы в немодальной форме посылается эвент о том, что работа закончена и результат работы.
По этому варианту пример приведу попозже, так как под рукой исходников нет вообще, а на память всего не напишу smile

2. Менее красивый:
У главной формы определить метод, через который можно передавать данные.
При завершении работы через ивнок лайтер вызвать у формы метод.
То есть примерно так:
Код

public class MainForm extends JForm
{
    public void setResult(int formID, String result) 
    {
    }
}

public class MainWorker extends Thread
{
    private int m_ID;
    private MainForm m_frm;

    public MainWorker(int id, MainForm frm)
    {
        m_frm = frm;
        m_ID = id;
    }

    public void run() 
    {
        String result;
        try 
        {
            //Do work
            result = "OK";
        }
        catch (InterruptedException ex)
        {
             result = "Error";
        }

        try 
        {
            final String returnResult = result;
            EventQueue.invokeLater(new Runnable() 
            {
                public void run() 
                {
                    frm.setResult(m_ID, returnResult);
                }
            });
        }
        catch (InterruptedException ex) 
        {     }
        catch (InvocationTargetException  ex) 
        {     }

    }
}


Автор: powerOn 13.3.2006, 08:17
Цитата

Цитата(MoonCat @ 12.3.2006, 16:15 )
...о синхронизиронизации.

От сказал так сказал...


smile ну я "перечепятал" лишнего.....
о синхронизации конечно речь идет...

Автор: SID_M 13.3.2006, 11:41
Спасибо!!! Очень благодарен всем. Проблема решена...

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