Для простоты представьте приложение, которое загружает файл. Существует простой графический интерфейс с одной меткой, которая отображает прогресс. Чтобы избежать нарушений EDT, я, как и каждый законный гражданин, загружаю файл в один поток (основной) и обновляю графический интерфейс пользователя в другом (EDT). Итак, вот соответствующий кусок псевдокода:
class Downloader {
download() {
progress.startDownload();
while(hasMoreChunks()) {
downloadChunk();
progress.downloadedBytes(n);
}
progress.finishDownload();
}
}
class ProgressDisplay extends JPanel {
JLabel label;
startDownload() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText("Download started");
}
});
}
downloadedBytes(int n) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText("Downloaded bytes: " + n);
}
});
}
finishDownload() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText("Download finished");
}
});
}
}
Мне нравится тот факт, что Java не поддерживает замыкания, а код мне кристально понятен. Шутки в сторону, мне интересно ... Я делаю это неправильно? Можно ли устранить все эти уродливые шаблоны с помощью SwingUtilities
, анонимную реализацию Runnable
в каждом методе и т. Д .?
Мой случай немного сложнее, чем этот, но я стараюсь не переусердствовать, используя прокси или что-то в этом роде.