Что касается комментария Ноэля:
Проблема, с которой может сработать этот метод, заключается в том, что конкретная реализация прослушивателя возвращает уведомление раньше и выполняет работу «вне диапазона» в отдельном потоке. В этом случае конец вызова уведомления фактически не отмечает конец выполнения слушателя. Если это реальная проблема (т. Е. Вы знакомы с другими, тщательно продуманными слушателями, которые занимаются подобными вещами, и знакомы с ними, возможно, вы захотите уточнить и вернуться к этой проблеме.
Используя SwingUtilities.invokeLater()
, вы уверены, что код выполняется после того, как все слушатели были уведомлены. Но один из этих слушателей может выполнять свою работу в отдельном потоке.
Если вам нужно выполнить код после того, как все слушатели не только были уведомлены, но и закончили свою работу, вы можете сделать что-то вроде этого:
псевдокод:
Listener implements MouseListener
+mouseClicked( event: MouseEvent )
SwingUtilities.invokeLater( // returns immediately
someTask()
)
-someTask()
// perform some long task.
Если у вас есть слушатели как
addListener( new Listener() )
addListener( new Listener() )
addListener( new Listener() )
addListener( new ExecuteAtTheEnd() )
Если все (или некоторые) из ваших слушателей выполняют свою работу в другом потоке. Ваш ExecuteAtTheEnd
может выполнять свой код в конце уведомления, но не в конце выполнения кода слушателя.
Итак, что вы делаете?
Вы должны синхронизировать использование какого-либо флага блокировки и выполнять ваш код, пока этот флаг не будет использован.
Это может быть счетчик, который увеличивается, когда слушатель выполняется, и уменьшается, когда нет:
Listener implements MouseListener
+mouseClicked( event: MouseEvent )
lockFlagCount++
SwingUtilities.invokeLater(
someTask()
)
-someTask()
// perform some long task.
lockFlag--
А затем вы просто продолжаете, пока этот флаг не станет ложным:
ExecuteAtTheEndListener implements MouseListener
+ mouseClicked( event: MouseEvent )
SwingUtilities.invokeLater(
executeAtTheEnd()
)
- executeAtTheEnd()
while( logFlagCount > 0 )
wait()
if( logFlagCount == 0 )
// continue with the task.
Конечно, все гораздо сложнее, поскольку я помещаю его в псевдокод, но оно должно работать, , если Вы находитесь в таких обстоятельствах.