Я использовал следующий подход для создания компонентов и возврата значений из Swing в/из вне EDT. Например, следующий метод может быть расширение для JFrame
, чтобы создать JPanel
и добавить его к родителю JFrame
:Возвращаемые значения из Swing с помощью invokeAndWait
public JPanel threadSafeAddPanel() {
final JPanel[] jPanel = new JPanel[1];
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
jPanel[0] = new JPanel();
add(jPanel[0]);
}
});
} catch (InterruptedException ex) {
} catch (InvocationTargetException ex) {
}
return jPanel[0];
}
Локальный массив 1-длины используется для передачи результата «» изнутри Runnable
, который вызывается в EDT. Ну, это выглядит «немного» взломанным, и поэтому мои вопросы:
- Имеет ли это смысл? Кто-нибудь еще делает что-то подобное?
- Является ли массив с 1 длиной хорошим способом передачи результата?
- Есть ли более простой способ сделать это?
1. Вы правы :-) 2. Хорошо, но invokeAndWait делает это. 3. Возможно, я должен использовать его, хотя для простых «геттеров» он немного переборщил. –
2. О, верно, что-то не зарегистрировались. –
1. SwingWorker - это не молот, который вы можете использовать, чтобы исправить все проблемы с потоками в приложениях Swing. 2. SwingWorker предназначен для работы с фоновыми потоками, но этот вопрос касается создания панели, которая должна быть запущена на EDT в любом случае - полная противоположность тому, что помогает SwingWorker. – Trejkaz