|
|
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Есть код выполняющий достаточно долгую загрузку данных, прогрессБар в это время висит и не двигается. Использование SwingWorker результатов пока что не дало. Перерыл все примеры в интернете. Сложность еще в том, что приложение достаточно большое, прогрессБар в нем на главном окне, а долгая загрузка данных инициируется переходом на одну из вкладок в дочернем окне. Как сделать чтобы прогрессБар работал в режиме indeterminate в это время? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Естественно, для прогрессБара перед этим выполнено setIndeterminate(true); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 11:07:18 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotir Код: java 1. 2. 3. 4. 5. 6. 7. Эта ерунда какая-то. Вы запускаете фоновый поток, чтобы потом усыпить текущий (Event Dispatch Thread). А делать этого не стоит. С тем же успехом можно задачу делать и в текущем потоке. Нужно код разбить на 3 части. 1. Перед запуском фоновой задачи. - Выполняется в EDT, по событию GUI 2. Фоновая задача. - Выполняется в SwingWorker.doInBackground() 3. Обработка результата фоновой задачи - обновление GUI - выполняется в SwingWorker.done() Поэтому у вас принципиально не верный подход. Нельзя повесить метод Feature getFeature(). В нем вообще нельзя что-то возвращать. Нужно запустить задачу и отпустить EDT заниматься дальше своими гуёвыми делами. А по окончании задачи, нужно вызва обработку Feature. Этот код вы не привели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 11:19:18 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Не вопрос, while убираем, но тогда SwingWorker.get() будет вешать интерфейс. Пункт 3 совсем не понял - что значит обновление ГУИ в отношении прогрессБара в INDETERMINATE MODE? Оно не должно быть в done, оно должно быть постоянным до завершения загрузки. авторПоэтому у вас принципиально не верный подход. Нельзя повесить метод Feature getFeature(). В нем вообще нельзя что-то возвращать. Нужно запустить задачу и отпустить EDT заниматься дальше своими гуёвыми делами. Был бы очень благодарен за любой, хотя бы самый простой, пример с возвращением значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 11:39:08 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirНе вопрос, while убираем, но тогда SwingWorker.get() будет вешать интерфейс. Пункт 3 совсем не понял - что значит обновление ГУИ в отношении прогрессБара в INDETERMINATE MODE? Оно не должно быть в done, оно должно быть постоянным до завершения загрузки. task.get() нужно вызывать в методе done(). BusotirБыл бы очень благодарен за любой, хотя бы самый простой, пример с возвращением значения. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 11:47:46 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
getFeature вызывается примерно из 30 других классов, как же это оптимальнее переделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 12:31:38 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirgetFeature вызывается примерно из 30 других классов, как же это оптимальнее переделать? Глаза боятся, а руки делают. Рефакторим! ... Чисто теоретически мне кажется можно сделать что-то аналогичное тому как работает диалог. Там метод прерывается, отдавая управление EDT. И потом по некому событию продолжается. Но как это реализуется на практике, я что-то пока не очень представляю. Надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 12:40:49 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
А не получится ли сделать, если вместо indeterminate использовать SwingWorker.process(), в котором простеньким алгоритмом закрашивать ProgressBar туда-обратно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 12:47:55 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Нашел. Даже очень интересное накопал, спасибо вам за вопрос. Итак. Первый вариант, проктальный. Не уверен что у вас получится. Вот тот цикл, в котором вы вызывали Thread.sleep(), надо поменять на специальный метод. Этот метод должен прокачивать события из EventQueue. Таким образом GUI будет работать, и в какой-то момент, между событиями, вы сможете увидеть, что Task.isDone() и продолжить выполнение. Все нужные методы, в принципе, есть в классе EventDispatchThread. Но они все package private. Методы эти используются, например в Dialog.show() - чтобы реализовать модальность. И преостановить выполнение метода, пока не закроется модальный диалог. Но кроме этого я набрел на вот какую интересную статью про Java 7 http://sellmic.com/blog/2012/02/29/hidden-java-7-features-secondaryloop/ Похоже то что вам нужно. Пока изучаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 12:51:33 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirА не получится ли сделать, если вместо indeterminate использовать SwingWorker.process(), в котором простеньким алгоритмом закрашивать ProgressBar туда-обратно? Не очень понял идею. process и publish, нужны чтобы публиковать промежуточные данные из фонового потока в EDT. В принципе, тоже самое можно сделать через invokeLater(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 12:53:21 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
SecondaryLoop - то что надо. Статья выше какая-то мутная. В JavaDoc доступно написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 13:02:50 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Добавлю. indeterminate mode к вопросу особого отношения не имеет. Это всего лишь режим отображения progress bar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2013, 13:42:52 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Огромное спасибо, SecondaryLoop идеально подошел к моему случаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 12:49:19 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BlazkowiczSecondaryLoop - то что надо. Статья выше какая-то мутная. В JavaDoc доступно написано. Если закрыть глаза на ошибку с race condition в примире JavaDoc то да, написано неплохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 14:56:32 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
МужикЕсли закрыть глаза на ошибку с race condition в примире JavaDoc то да, написано неплохо. Спасибо за замечание! Дефект не только в JavaDoc, а даже в том что API этого не предусматривает http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6980209 Вероятно .exit() стоит вызывать только через invokeLater()/invokeAndWait, чтобы дать EDT возможность закончить loop.enter(); Либо проверять значение, которое вернул метод exit(), то что потом с ним делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 15:20:29 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЛибо проверять значение, которое вернул метод exit(), то что потом с ним делать? Для меня, если честно, вообще загадка, зачем сейчас нужно то значение, которое возвращает exit(). Эту фичу обсуждали на java.net, до того как ее добавили в Java 7. Причем в обсуждении было фактически расписано как ее нужно сделать, но сделали почему-то вот так. Кому она теперь в таком виде нужна, непонятно. Кстати создание внутреннего цикла EDT было возможно и до Java 7, правда некрасивым хаком с Reflection. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 17:36:25 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
МужикДля меня, если честно, вообще загадка, зачем сейчас нужно то значение, которое возвращает exit(). Эту фичу обсуждали на java.net, до того как ее добавили в Java 7. Причем в обсуждении было фактически расписано как ее нужно сделать, но сделали почему-то вот так. Есть ссылка? МужикКому она теперь в таком виде нужна, непонятно. Лучше чем ничего. МужикКстати создание внутреннего цикла EDT было возможно и до Java 7, правда некрасивым хаком с Reflection. Да, я это и имел ввиду выше в первом проктальном варианте 14906297 . Реализацию можно просто слизать с метода Dialog.show, выкинув всё лишнее. Смущает, правда, что там не всё так тривиально. Помимо пропихивание событий ещё и такое, например Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 17:43:29 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЕсть ссылка? Нет, форумы java.net потерли. Возможно, какой-то поисковик/архив успел их проиндексировать/сохранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2013, 17:53:25 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
В продолжение темы: Теперь встала задача выводить в процессе подгрузки данных текстовую информацию в прогрессБар. Нашел в классах цикл for, где идет долгий процесс. Надо в каждом проходе цикла выполнить чтото вроде ProgressBar.setString("Loaded " + i + " entities"). Само собой просто в лоб вызов не работает. SwingWorker.invokeLater() не помогает. Информация все равно выводится только после загрузки всех данных. Чего я не учел? Как правильно вызывать методы Свинга из рабочего потока? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 19:23:21 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, конечно же SwingUtilities.invokeLater() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 19:33:24 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotir, Код покажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2013, 20:38:17 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 18:40:43 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Проблема опять в том, как использовать SwingWorker при условии когда метод не void. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 18:42:19 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirПроблема опять в том, как использовать SwingWorker при условии когда метод не void. Это не проблема. Очевидно что нужно SwingWorker<ResultType, IntermediateResultType> вместо SwingWorker<Void, IntermediateResultType> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 18:52:19 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Я про ожидание Код: java 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 18:54:39 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotir, если вам нужна помощь, совет или подсказка, то сделайте над собой усилие и постарайтесь внятно и подробно обрисовать суть вашего вопроса. Либо ждите может кто другой ответить. Играть в "угадайте что я имел ввиду" никакого желания у меня сейчас нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:05:26 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, суть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:14:49 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Иначе говоря, стоит задача корректно получить возвращаемое значение в методе, в котором вызывается SwingWorker.execute(), при этом в процессе получения значения требуется изменять текст ПрогрессБара (который находится в indeterminate mode). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:20:30 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotirсуть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground(). Что такое "данная реализация" мне не понятно. Покажите ваш код, где используется и промежуточное значение и результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:21:49 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirBlazkowicz, Я про ожидание Код: java 1. 2. 3. 4. 5. 6. Такого кода при искпользовани SwingWorker быть не должно. Его можно добиться только с помощью SecondaryLoop. Выберите что-то одно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:22:55 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirИначе говоря, стоит задача корректно получить возвращаемое значение в методе, в котором вызывается SwingWorker.execute(), при этом в процессе получения значения требуется изменять текст ПрогрессБара (который находится в indeterminate mode). Нельзя просто так запустить SwingWorker и вернуть его результат. Нужно зарефакторить весь код, так чтобы обработка результата вызывалась из метода done. То что вы хотите делается без SwingWorker-а с помощью SecondaryLoop. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:24:55 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBusotirсуть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground(). Что такое "данная реализация" мне не понятно. Покажите ваш код, где используется и промежуточное значение и результат. Данная реализация - тот код что я привел. Промежуточные значения - те, которые передаются методом publish() в каждом проходе цикла for. Результат - то что в return метода handle(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:26:55 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, с SecondaryLoop я пробовал, но результат был тот же - выводился текст только после окончания загрузки холдингов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:37:42 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotirс SecondaryLoop я пробовал, но результат был тот же - выводился текст только после окончания загрузки холдингов. Как всегда подробно и предметно. Ещё раз повторяю. Код вида Код: java 1. 2. 3. 4. 5. ...смысла не имеет, так как блокирует Event Dispatch Thread до окончания обработки фоновой задачи, чего собственно SwingWorkter и должен помочь избежать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 19:42:51 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Ниже мой код с SecondaryLoop. Только где здесь ProgressIndicator.setString() вставить? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 20:45:32 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Busotir, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2013, 22:10:44 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Такой способ уже пробовал, не помогло. Сейчас пробую скрестить SecondaryLoop и SwingWorker, вроде чтото начинает получаться с ГУИ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 12:50:12 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirТакой способ уже пробовал, не помогло. Вы мне нагло врете и не стыдитесь этого. Вот работающий код. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. Обратите внимание на коментарии выше, такое тривиальное использование secondaryLoop не безопасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 13:10:03 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Поставил indeterminate mode в false перед выводом текста в прогрессбар, все корректно заработало без SwingWorker. Я так понимаю, нет разницы, использовать SwingUtilities или EventQueue. Спасибо за помощь и обилие комплиментов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 13:53:42 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirПоставил indeterminate mode в false перед выводом текста в прогрессбар, все корректно заработало без SwingWorker. Ну, вот опять. Добавляем Код: java 1. ...в мой пример. И о, чудо! Работает и без SwingWorker. indeterminate к проблеме отношения не имеет. BusotirЯ так понимаю, нет разницы, использовать SwingUtilities или EventQueue. Принципиальной нет. BusotirСпасибо за помощь и обилие комплиментов. О каких комплиментах речь? Я, вроде, здерживаюсь как могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 14:04:31 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
Попробуйте без механизма Future сделать с indeterminate mode true. Смысл мне заливать, сейчас вот еще раз проверил (setValue закомментировал, только setString используется). Ну не выводит текст в indeterminate mode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 15:09:38 |
|
||
|
JProgressBar indeterminate mode и SwingWorker
|
|||
|---|---|---|---|
|
#18+
BusotirПопробуйте без механизма Future сделать с indeterminate mode true. :) Даже пробовать не хочу. И так знаю, что будет работать. Перепишите мой пример чтобы не работало. BusotirСмысл мне заливать, сейчас вот еще раз проверил (setValue закомментировал, только setString используется). Проблема в чем-то другом. А вы пеняете на совершенно не связанные с проблемой методы и свойства. BusotirНу не выводит текст в indeterminate mode. Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2013, 15:25:07 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128125]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
201ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 537ms |

| 0 / 0 |
