Я работаю с Swing ProgressMonitor.
Это создает приятное диалоговое окно для меня:
Честно говоря, я думаю, что есть недостаток в дизайне ProgressMonitor
: что вы думаете, если пользователь закрывает диалоговое окно, нажимая красный/белый крест? Да, вы догадались: он просто закрывает/скрывает диалог, и все, что вы делаете на заднем плане, конечно, продолжается. Там нет способа вернуть диалоговое окно, afaik.
Закрытие окна должно означать "отменить" или просто не разрешено, потому что мне нужно, чтобы пользователь либо дождался завершения задачи, либо отменил ее. Как мне достичь этого?
Если бы я мог просто получить ссылку на этот JDialog, тогда я мог бы сделать:
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
но я не могу получить эту ссылку.
ОБНОВЛЕНИЕ И ОКОНЧАТЕЛЬНЫЙ ОТВЕТ
Итак, я не рассказывал вам всю историю. Фактически я использую ProgressMonitorInputStream, который, конечно, под обложками использует ProgressMonitor, поэтому я думал, что это не имеет значения для рассматриваемого случая. Но это так!
Андрей прав, когда говорит, что ProgressMonitor
устанавливает флаг isCancelled, когда диалог закрыт. Это можно проверить, посмотрев источники JDK. Но для того, чтобы поймать это событие, вам понадобится PropertyChangeListener
. При работе с ProgressMonitorInputStream
вас, скорее всего, не будет такого (как я), потому что обновление ProgressMonitor
позаботится ProgressMonitorInputStream
поэтому вам не придется самостоятельно выполнять эту часть. Я был в предположении, что ProgressMonitorInputStream
raison d'etre не должен был кодировать код.
Я должен сказать, что я нахожу преимущества использования ProgressMonitorInputStream
чрезвычайно маленькими или даже отрицательными по сравнению с подходом DIY.
Проверьте ProgressMonitor.isCanceled()
, что и делает ProgressMonitorDemo
.
windowClosing()
,JOptionPane
имеет обработчикwindowClosing()
; Вы также можете увидеть изменения свойств работников.