Для простоты представьте себе приложение, которое загружает файл. Существует простой графический интерфейс с одной меткой, отображающей прогресс. Чтобы избежать нарушений EDT, я, как и каждый законопослушный гражданин, скачиваю файл в одном потоке (основном), а обновляю GUI в другом (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
в каждом методе и т. д.?
Мой случай немного сложнее, чем этот, но я стараюсь не переусердствовать, внедряя прокси или что-то в этом роде.
new Runnable()
в основном. - person gpeche   schedule 02.06.2011runInEdt({label.setText("Download started");})
Или даже:runInEdt(someBiggerAction)
, гдеsomeBiggerAction
— имя метода. Я знаю, что я испорчен, и это никоим образом не возможно в Java, но я не могу представить, что после стольких лет все нарушают EDT или пишут эту 4-строчную обертку 100 раз. - person Konrad Garus   schedule 02.06.2011new Runnable
. Вы можете получитьrunInEdt
сейчас. На самом деле у вас уже есть, он называетсяSwingUtilities.invokeLater
. Java немного многословен (по дизайну). - person gpeche   schedule 02.06.2011