Почему SwingWorker#setProgress ограничен [0, 100]?

SwingWorker#setProgress выдает IllegalArgumentException, если аргумент 't от 0 до 100. Я думал, что основной целью метода setProgress было обновление JProgressBar (как это было в это руководство). Если это так, то зачем ограничивать прогресс SwingWorker значением [0, 100], если прогресс JProgressBar не ограничен?


person Jeffrey    schedule 19.01.2012    source источник
comment
@ MДΓΓБДLL Вот о чем я думал, но я хотел узнать, была ли настоящая причина.   -  person Jeffrey    schedule 20.01.2012


Ответы (4)


Есть ли веская причина, по которой они ограничили прогресс до [0,100]?

В той мере, в какой этот вопрос имеет конструктивный ответ, понятие прогресса, вероятно, лучше всего известно тому, что моделируется в фоновом потоке. Масштабирование ограничивает количество отображаемых деталей.

В то же время SwingWorker < em>предназначен для подкласса. Ничто не мешает добавить метод setProgress(int progress, in min, int max) и поддержку изменения сопутствующего свойства, но трудно увидеть какое-либо преимущество — получатель просто должен масштабировать его для отображения.

person trashgod    schedule 20.01.2012
comment
ааааа, пора спать +1 - person mKorbel; 20.01.2012
comment
setProgress не метод, предназначенный для переопределения (тривиально, поскольку он окончательный :-), а также не обходит контракт прогресса свойства - person kleopatra; 20.01.2012

Обсуждать дизайн API довольно занимательно, но склонны к догадкам :-)

Несколько случайных мыслей в конце недели:

  • базовая модель процесса SwingWorker состоит в том, чтобы позволить что-то делать в фоновом режиме и поддерживать отправку как промежуточных, так и конечных результатов обратно в EDT.

  • он предназначен для создания подклассов (как уже подчеркивал @trashgod), в то же время он пытается свести к минимуму усилия, необходимые для этого: состояние и ход выполнения являются полностью определенными и реализованными удобными свойствами, предназначенными для использования как- является.

  • при этом правила API-документа, в которых четко указано, что допустимые значения процесса связанного свойства находятся в диапазоне от 0 до 100, инклюзивно. Никакой двусмысленности, ничего нельзя изменить в пользовательских реализациях. Отображение прогресса в процентах является наиболее распространенным вариантом использования, поддержка которого нестандартно является разумным решением.

  • для сообщения промежуточных результатов в координатах, отличных от процентов, предполагаемый путь - реализовать процесс (..). Это зависит от пользовательской реализации, что именно она делает, может запускать пользовательское определенное свойство или напрямую заполнять модель представления или... что угодно

  • наконец, учебный пример — это просто пример. Плюс он сам по себе противоречив: в описании упоминается метод task.getLenghtOfTask, который не реализован в кастомном свингворкере. Мое (дикое) предположение состоит в том, что текст примера все еще основан на более старой версии, которая могла поддерживать произвольные значения.

Чтобы ответить на вопрос (мои 0,02 евроцента :-) - в дизайне нет ничего плохого, это хорошо сбалансированная базовая реализация, которая готово обрабатывает распространенные варианты использования и в то же время достаточно гибка, чтобы упростить более сложные требования. реализовать.

обновить, как только будет доступна одна часть информации

вы не можете полностью контролировать детализацию отчетов: все, что вы можете сделать, это определить единицу наименьшего фрагмента, а затем ожидать получения одной или нескольких из этих наименьших монет.

person kleopatra    schedule 20.01.2012

1) SwingWorker#setProgress ---> Я принимаю это как процентное значение, в основном существует диапазон от 0 до 100, согласен, что алгебра знает отрицательные % или 1M в %, но таким же образом вы можете вычислить четвертое/пятое измерение, немного сложнее может быть с уравнением Дрейка, но возможно

2) JProgressBar ---> не имеет этого ограничения/запрета, т.к. можно написать красивый код, где можно переключаться (JComboBox) между значениями в %, Mb, оставлять.... для прогресса

person mKorbel    schedule 19.01.2012
comment
Да, рабочий должен масштабировать результат перед вызовом setProgress(), как показано здесь. - person trashgod; 20.01.2012
comment
Есть ли веская причина, по которой они ограничили прогресс до [0,100], или это был просто (плохой) выбор дизайна? - person Jeffrey; 20.01.2012
comment
нет, это не настоящая причина для ограничения, возможно, кто-то, кто создал этот API, может ответить на ваш вопрос, но API говорит, что реализовано BoundProperty java.sun.com/developer/onlineTraining/Beans/Beans4/bound.html для PropertyChangeListener docs.oracle.com/javase/tutorial/uiswing/events/, однако у этих реализаций Future in Swing долгая история, полная демонстраций, исправлено в Java1.6_019 или 20 - person mKorbel; 20.01.2012
comment
@Jeffrey: подробнее здесь. - person trashgod; 20.01.2012

Это зависит от вашего варианта использования, но вы также можете использовать метод публикации для публикации хода выполнения и обновления индикатора выполнения в методе публикации. См. мой ответ на другой вопрос SO для примера

person Robin    schedule 19.01.2012
comment
Я думал об использовании этого, но это не сработает для моего варианта использования. Я использую SwingWorker для получения информации для JTable в зависимости от того, какие индексы строк выбраны в этой таблице. Для каждого выбранного индекса SwingWorker получает необходимую информацию для этой строки (от 1 до x фрагментов информации) и использует publish и process для обновления модели JTable, когда вся строка информации становится доступной. Однако я хочу, чтобы JProgressBar обновлялось, как только будет доступна отдельная часть информации (а не когда будет доступна целая строка). - person Jeffrey; 20.01.2012