Java SWT - лучший способ вернуть данные из компонентов в другие потоки - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть приложение Java SWT, которое запускает отдельный поток (кроме пользовательского интерфейса) для подключения к серверу чата.Если я хочу обновить компоненты пользовательского интерфейса из потока подключения, я легко могу сделать следующее:

        myUIclass.MyShellReference.getDisplay().asyncExec(
               new Runnable() {
                 public void run(){
                     ... update some UI component

                 }
               }
        );

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

private String getTheText(){
    final String thetext;           
    myUIclass.MyShellReference.getDisplay().asyncExec(
        new Runnable() {
              public void run(){

                    // The below wont' work because thetext is final
                        // which is required in a nested class... blah!
                        thetext = myUIclass.getTextFromSomeTextBox();
            }
         }
     );
    return thetext;
}

Проблема выше в том, что я не могу на самом деле захватвозвращается из метода getTextFromSomeTextBox (), потому что я могу использовать только конечные переменные, которые не могут быть назначены.Единственное другое решение, которое я знаю, это использование некоторого эталонного объекта Atomic, но должен быть лучший способ, так как я уверен, что люди должны делать это постоянно.

Любая помощь будет принята с благодарностью !!!

1 Ответ

3 голосов
/ 03 февраля 2012

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

private String getTheText(){
    final String[] thetext = new String[1]; //very stupid solution, but good for demonstrating the idea

    myUIclass.MyShellReference.getDisplay().syncExec( //you should use sync exec here!
        new Runnable() {
              public void run(){

                    // The below wont' work because thetext is final
                        // which is required in a nested class... blah!
                        thetext[0] = myUIclass.getTextFromSomeTextBox();
            }
         }
     );
    return thetext[0];
}

Другой способ - использовать обратные вызовы или Future объекты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...