Использование invokeLater или invokeAndWait для ожидания ответа от другого графического интерфейса - PullRequest
2 голосов
/ 07 октября 2011

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

Каков наилучший способ заставить метод слияния ожидать ответа от MergeUI?Я пытался использовать InvokeAndWait, но я не мог понять, как заставить его работать.

public GlossaryEntry merge(GlossaryEntry otherEntry){
    //First, merge the definitions
    GlossaryEntryMergeUI thisMerge = new GlossaryEntryMergeUI(this,otherEntry,mergeSignal);
    thisMerge.setVisible(true);
    thisMerge.setAlwaysOnTop(true);

    GlossaryEntry combined = new GlossaryEntry(word);
    combined.addDefinitions(thisMerge.getDefinitions());

    return combined;
}

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Это не имеет ничего общего с использованием invokeAndWait или invokeLater и всего, что связано с прослушиванием в одном потоке ответа в другом.Если вы не используете для этого модальный диалог, такой как JOptionPane (который довольно прост в использовании и может содержать очень сложный графический интерфейс при необходимости), рассмотрите возможность использования слушателя или иного известного как шаблон проектирования наблюдателя, чтобы уведомить не-GUI компонент, когда обрабатывается GUI.

Кроме того, является ли GlossaryEntryMergeUI единственным графическим интерфейсом пользователя, с которым контактирует пользователь?Или это вызвано из другого GUI, возможно, «родительского» GUI?Если последнее, то модальный диалог, а не JFrame - это путь.Изменить: или CardLayout в соответствии с отличным ответом mKorbel.

2 голосов
/ 07 октября 2011
  • рассмотрим поиск CardLayout вместо переключения между двумя или более окнами

  • если есть Serializable или Observate, то лучше заключить код в invokeAndWait (), для простого переключения между двумя окнами есть invokeLater ()

  • Я бы посоветовал не использовать два JFrame одновременно, один JFrame и другое Window были бы JDialod или JWindow, потому что (например, если есть задание BackGroung) иногда бывает очень сложно переключать Focus с одного JFrame на другой , чтобы не перемещать JFrame toFront () ...

...