2016-03-11 3 views
0

Там хорошая дискуссия по EventQueue.invokeLater() here.EventQueue.invokeLater с несколькими качелями Uis

У меня есть класс контроллера, который загружает Master() два окна пользовательского интерфейса в моем приложении. Например:

public class Master(){ 

    public Master(){ 
     aView = new subView(); 
     bView = new subView(); 

Где subView расширяет JFrame и имеет следующий основной метод:

public class SubView extends JFrame{ 
    .... 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new SubView(); 
      } 
     });} 
} 

SubView.main() Обратите внимание, что устройства используются invokeLater(). Мой вопрос как я могу invokeLater() в пределах мастера? Что-то вроде:

public class Master(){ 

    public Master(){ 
     aView = EventQueue.invokeLater(new subView); 
     bView = EventQueue.invokeLater(new subView); 

Это не так просто, потому что invokeLater ничего не возвращает. Кроме того, поскольку он «вызывается позже», значения aView и bView остаются пустыми в Master. Есть ли способ вызвать оба метода таким же образом, что main() будет ссылаться на один из них в потоке runLater?

+0

Вам действительно нужно? Если 'Master' всегда создается на EDT, тогда нет необходимости использовать' invokeLater'. – davmac

+0

(Также: это 'aView = subView();' предполагается сказать 'aView = новый SubView();'?) – davmac

+0

(Наконец: 'aView = EventQueue.invokeLater (новый subView);' неправильный синтаксис для базовой конструкции. Вероятно, это означало 'aView = EventQueue.invokeLater (новый SubView());??) – davmac

ответ

1

Я бы использовал invokeAndWait, поскольку вам нужно ждать результата.

SubView aView, bView; 

public Master() { 
    java.awt.EventQueue.invokeAndWait(new Runnable() { 
     public void run() { 
      aView = new SubView(); 
      bView = new SubView(); 
     } 
    }); 
    // aView and bView will be initialised. 
} 
+0

Спасибо. Это вызывает удивительный смысл: позвольте мне попробовать, и тогда я вернусь и приму ответ. Просто для моего понимания это означает, что aView и bView работают в общем, но отдельном потоке из основного потока, правильно? –

+1

А, так что одна проблема, с которой я столкнулась, - это aView, а BView не может получить доступ к Master(). Мне нужно сохранить их как поля. Позвольте мне поиграть с ним и отчитаться. –

+0

@AdamHughes Вам нужно либо сохранить их в виде полей, либо сохранить их в коллекциях или массиве, который инициализирован перед запуском задачи. –

0

По предложению Петра, я сделал следующее:

Я создал промежуточный Runnable называется RunUIThread, который возвращает, который предоставляет объекты aView и bView, так что я могу вернуть их к моей магистерской программе. Питер, как вы думаете, это действительно так?

RunUIThread uiThread = new RunUIThread(); 
    try { 
     java.awt.EventQueue.invokeAndWait(uiThread); 
    } catch (InterruptedException | InvocationTargetException ex) { 
     LOG.error("MasterView interrupted or failed to invoke RunUIThread"); 
    } 
    aView = uiThread.getaView(); 
    bView = uiThread.getbView();  
1

Это может оказаться неудобно, чтобы решить эту проблему, ссылаясь на примеры из Runnable. В качестве альтернативы используйте SwingWorker для обновления табличных моделей как основных, так и подробных представлений. Этот example может быть полезной точкой отсчета.

+0

Хорошо, спасибо, я проверю это. –

 Смежные вопросы

  • Нет связанных вопросов^_^