Я использую следующий подход для создания компонентов и возврата значений из Swing в/из вне EDT. Например, следующий метод может быть расширением JFrame
для создания JPanel
и добавления его к родительскому JFrame
:
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 длины хорошим способом передачи результата?
- Есть ли более простой способ сделать это?