Да, решение, на которое вы ссылаетесь, является разумным и простым решением («лучшее» настолько субъективно :) Вы можете использовать SwingWorker # get , который является частью интерфейса Future:
SwingWorker<EnvInfoProto, Void> worker = new SwingWorker<EnvInfoProto, Void>() {
...
};
worker.execute();
worker.get(15, TimeUnit.SECONDS);
//will block 15 seconds at most, then throw TimeoutException
Конечно, вы могли бы придумать разные способы для достижения своей цели, но я бы поспорил, что здесь задействовано больше кода, чем в этом решении, поэтому я бы попробовал.