Как отключить кнопку отмены при использовании javax.swing.ProgressMonitor? - PullRequest
2 голосов
/ 04 февраля 2009

Я бы хотел использовать функциональность ProgressMonitor, но я не хочу давать пользователю возможность отменить действие. Я знаю, что если я не позвоню isCanceled(), то нажатие кнопки не даст эффекта, но я бы предпочел, чтобы пользователь не поверил, что программа не отвечает.

Как мне поступить?

Ответы [ 4 ]

3 голосов
/ 23 апреля 2009

Я не знаю, почему все поля ProgressMonitor являются закрытыми. Наверное, не самое гордое творение мистера Годслинга:)

 * @author James Gosling
 * @author Lynn Monsanto (accessibility) 
 * @version 1.37 04/12/06

Просто клонируйте его вместе с некоторыми частными пакетами из Swing, затем вы можете делать все, что захотите, например, добавлять флаг для отмены и использовать его в конструкторе ProgressOptionPane.


(ОБНОВЛЕНИЕ) Если вы не можете получить JDK-код под SCSL, то вот хитрый способ завладеть JDialog, тогда вы можете делать все, что захотите, включая удаление кнопки Отмена:

progressMonitor = new ProgressMonitor(ProgressMonitorDemo.this,
                                     "Running a Long Task",
                                     "", 0, 100);
progressMonitor.setMillisToDecideToPopup(0);
progressMonitor.setMillisToPopup(0);
progressMonitor.setProgress(0);
JDialog dialog = (JDialog)progressMonitor.getAccessibleContext().getAccessibleParent();
JOptionPane pane = (JOptionPane)dialog.getContentPane().getComponent(0);
pane.setOptions(new Object[]{});

Это ужасно и полностью зависит от реализации ProgressMonitor. Поэтому вы должны проверить ClassCastException и NULL.

Почему вам нужно установить оба периода времени на 0? В противном случае диалог не создается в setProgress.

3 голосов
/ 04 февраля 2009

Вы не можете. Создайте свой собственный диалог, используя JProgressBar, как описано в Учебное пособие по Java .

1 голос
/ 02 июля 2011

Я знаю, что это сообщение немного старое, но первый ответ на Google, поэтому я опубликую свой ответ ...

У меня нет решения отключить кнопку отмены, но я использую этот совет: заново отображать монитор прогресса при нажатии кнопки отмены.

public void propertyChange (PropertyChangeEvent event) {
    if (event.getPropertyName().equals("progress")) {
        int progress = ((Integer) event.getNewValue()).intValue();
        lastProgress = progress;
        progressMonitor.setProgress(progress);
    }
    if (progressMonitor.isCanceled()) {
        progressMonitor = new ProgressMonitor(panel, "", "", 0, 100);
        progressMonitor.setMillisToDecideToPopup(0);
        progressMonitor.setMillisToPopup(0);
        progressMonitor.setProgress(lastProgress);
    }
}

Конечно, вам нужно запомнить последнее значение прогресса.

Это решение немного уродливо, но оно работает для меня.

Yves

0 голосов
/ 04 февраля 2009

Первый вопрос: почему вы не хотите, чтобы пользователь мог отменить действие? Если это занимает так много времени, почему они не могут решить, что не хотят этого ждать?

Если вы действительно не хотите кнопку отмены, вам придется прикусить пулю и создать свой собственный диалог прогресса. Вы можете посмотреть на источник ProgressMonitor, чтобы увидеть, как они это делают (они используют JOptionPane для диалога и передают ему пару Strings и JProgressBar).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...