powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JProgressBar indeterminate mode и SwingWorker
42 сообщений из 42, показаны все 2 страниц
JProgressBar indeterminate mode и SwingWorker
    #38412713
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть код выполняющий достаточно долгую загрузку данных, прогрессБар в это время висит и не двигается. Использование 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.
    public final Feature getFeature()
    {
        if (theFeature == null)
        {
            Task task = new Task();
            task.execute();
            while (!task.isDone()) {
                //Sleep for one second.
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ignore) {}
            }

            try
            {
                theFeature = task.get();
            }
            catch (InterruptedException exception)
            {
                exception.printStackTrace();
            }
            catch (ExecutionException exception)
            {
                exception.printStackTrace();
            }
        }
        return theFeature;
    }

	 
    class Task extends SwingWorker<Feature, Void>
    {
        @Override
        public Feature doInBackground()
        {
            Feature feature = null;
            feature = Proxy.getInstance(theEntity).getFeature(theEntity, theFeatureName);
            return feature;
        }
    }



Естественно, для прогрессБара перед этим выполнено setIndeterminate(true);
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412737
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotir
Код: java
1.
2.
3.
4.
5.
6.
7.
            while (!task.isDone()) {
                //Sleep for one second.
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ignore) {}
            }
    }



Эта ерунда какая-то. Вы запускаете фоновый поток, чтобы потом усыпить текущий (Event Dispatch Thread). А делать этого не стоит. С тем же успехом можно задачу делать и в текущем потоке.
Нужно код разбить на 3 части.
1. Перед запуском фоновой задачи. - Выполняется в EDT, по событию GUI
2. Фоновая задача. - Выполняется в SwingWorker.doInBackground()
3. Обработка результата фоновой задачи - обновление GUI - выполняется в SwingWorker.done()

Поэтому у вас принципиально не верный подход. Нельзя повесить метод Feature getFeature(). В нем вообще нельзя что-то возвращать.
Нужно запустить задачу и отпустить EDT заниматься дальше своими гуёвыми делами.
А по окончании задачи, нужно вызва обработку Feature. Этот код вы не привели.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412774
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не вопрос, while убираем, но тогда SwingWorker.get() будет вешать интерфейс.
Пункт 3 совсем не понял - что значит обновление ГУИ в отношении прогрессБара в INDETERMINATE MODE? Оно не должно быть в done, оно должно быть постоянным до завершения загрузки.

авторПоэтому у вас принципиально не верный подход. Нельзя повесить метод Feature getFeature(). В нем вообще нельзя что-то возвращать.
Нужно запустить задачу и отпустить EDT заниматься дальше своими гуёвыми делами.
Был бы очень благодарен за любой, хотя бы самый простой, пример с возвращением значения.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412794
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
    public final void loadFeature()
    {
            Task task = new Task();
            task.execute();
    }

	 
    class Task extends SwingWorker<Feature, Void>
    {
        @Override
        public Feature doInBackground()
        {
            Feature feature = null;
            feature = Proxy.getInstance(theEntity).getFeature(theEntity, theFeatureName);
            return feature;
        }
        @Override
        public void done(){
            Feature feature = task.get();
            updateGUI(feature);
        }
    }
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412866
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
getFeature вызывается примерно из 30 других классов, как же это оптимальнее переделать?
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412888
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirgetFeature вызывается примерно из 30 других классов, как же это оптимальнее переделать?
Глаза боятся, а руки делают. Рефакторим!
...
Чисто теоретически мне кажется можно сделать что-то аналогичное тому как работает диалог. Там метод прерывается, отдавая управление EDT. И потом по некому событию продолжается.
Но как это реализуется на практике, я что-то пока не очень представляю. Надо подумать.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412905
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не получится ли сделать, если вместо indeterminate использовать SwingWorker.process(), в котором простеньким алгоритмом закрашивать ProgressBar туда-обратно?
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412918
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел. Даже очень интересное накопал, спасибо вам за вопрос.
Итак. Первый вариант, проктальный. Не уверен что у вас получится. Вот тот цикл, в котором вы вызывали 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/
Похоже то что вам нужно. Пока изучаю.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412923
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirА не получится ли сделать, если вместо indeterminate использовать SwingWorker.process(), в котором простеньким алгоритмом закрашивать ProgressBar туда-обратно?
Не очень понял идею. process и publish, нужны чтобы публиковать промежуточные данные из фонового потока в EDT. В принципе, тоже самое можно сделать через invokeLater().
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38412940
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SecondaryLoop - то что надо. Статья выше какая-то мутная. В JavaDoc доступно написано.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38413040
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю. indeterminate mode к вопросу особого отношения не имеет. Это всего лишь режим отображения progress bar.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414159
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Огромное спасибо, SecondaryLoop идеально подошел к моему случаю.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414353
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczSecondaryLoop - то что надо. Статья выше какая-то мутная. В JavaDoc доступно написано.
Если закрыть глаза на ошибку с race condition в примире JavaDoc то да, написано неплохо.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414408
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикЕсли закрыть глаза на ошибку с race condition в примире JavaDoc то да, написано неплохо.
Спасибо за замечание!
Дефект не только в JavaDoc, а даже в том что API этого не предусматривает
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6980209
Вероятно .exit() стоит вызывать только через invokeLater()/invokeAndWait, чтобы дать EDT возможность закончить loop.enter();
Либо проверять значение, которое вернул метод exit(), то что потом с ним делать?
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414703
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЛибо проверять значение, которое вернул метод exit(), то что потом с ним делать?
Для меня, если честно, вообще загадка, зачем сейчас нужно то значение, которое возвращает exit(). Эту фичу обсуждали на java.net, до того как ее добавили в Java 7. Причем в обсуждении было фактически расписано как ее нужно сделать, но сделали почему-то вот так. Кому она теперь в таком виде нужна, непонятно.
Кстати создание внутреннего цикла EDT было возможно и до Java 7, правда некрасивым хаком с Reflection.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414718
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МужикДля меня, если честно, вообще загадка, зачем сейчас нужно то значение, которое возвращает exit(). Эту фичу обсуждали на java.net, до того как ее добавили в Java 7. Причем в обсуждении было фактически расписано как ее нужно сделать, но сделали почему-то вот так.
Есть ссылка?

МужикКому она теперь в таком виде нужна, непонятно.
Лучше чем ничего.


МужикКстати создание внутреннего цикла EDT было возможно и до Java 7, правда некрасивым хаком с Reflection.
Да, я это и имел ввиду выше в первом проктальном варианте 14906297 .
Реализацию можно просто слизать с метода Dialog.show, выкинув всё лишнее.
Смущает, правда, что там не всё так тривиально. Помимо пропихивание событий ещё и такое, например
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
// Dispose SequencedEvent we are dispatching on the the current
// AppContext, to prevent us from hang - see 4531693 for details
SequencedEvent currentSE = KeyboardFocusManager.
getCurrentKeyboardFocusManager().getCurrentSequencedEvent();
if (currentSE != null) {
                log.fine("Dispose current SequencedEvent: " + currentSE);
                currentSE.dispose();
}
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38414735
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсть ссылка?
Нет, форумы java.net потерли. Возможно, какой-то поисковик/архив успел их проиндексировать/сохранить.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38471827
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжение темы:
Теперь встала задача выводить в процессе подгрузки данных текстовую информацию в прогрессБар. Нашел в классах цикл for, где идет долгий процесс. Надо в каждом проходе цикла выполнить чтото вроде ProgressBar.setString("Loaded " + i + " entities"). Само собой просто в лоб вызов не работает. SwingWorker.invokeLater() не помогает. Информация все равно выводится только после загрузки всех данных. Чего я не учел? Как правильно вызывать методы Свинга из рабочего потока?
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38471850
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, конечно же SwingUtilities.invokeLater()
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38471931
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotir,
Код покажите.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477186
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.
    public class MyWorker extends SwingWorker<Object, Integer>
    {
        private final RootEntityImpl aDispatchable;
        public MyWorker(final RootEntityImpl aDispatchable)
        {
            this.aDispatchable = aDispatchable;
        }
        
        protected Object doInBackground() throws Exception
        {
            Jas myRoot = (Jas) itsModelMap.getRelatedNode(aDispatchable);
            HoldingList myHoldingList = (HoldingList) itsNodeFinder.findNode(myRoot, HoldingList.class);
            FeatureImpl myFeatureImpl = null;
            if (myHoldingList != null && !myHoldingList.isAbsent())
            {
                myFeatureImpl = new RootEntityImpl.International();
                // Attach the Feature to its RootEntity.
                aDispatchable.addFeature(RootEntity.FEATURE_INTERNATIONAL, myFeatureImpl);
                itsModelMap.relate(myFeatureImpl, myHoldingList);
                // For now build all the holdings with company information
                try
                {
                    Holding myHolding = new Holding();
                    Map[] myResults = itsConnection.searchOneLevel(myHoldingList.getDN(), "(objectClass=" + myHolding.getManagedObjectName() + ")", null);
                    for (int i = 0; i < myResults.length; i++)
                    {
                        myHolding.fill(myResults[i]);
                        myHoldingList.addChild(myHolding);
                        buildSubTree(myHolding);
                        publish(Integer.valueOf(i+1));
                        myHolding = new Holding();
                    }
                }
                catch (ComException anEx)
                {
                    throw new PresentationModelException(anEx);
                }
            }
            return myFeatureImpl;
        }
        
        protected void process(List<Integer> holdingsLoaded)
        {
            for (Integer i : holdingsLoaded)
            {
                ProgressIndicator.getInstance().setString("Loaded " + i + " holdings");
            }
        }

        public void done() 
        {
            try 
            {
                rootFeatureImpl = get();
            } 
            catch (InterruptedException ignore) 
            {
            }
            catch (java.util.concurrent.ExecutionException e) 
            {
            }
        }
    }
    
    public Object handle(RootEntityImpl aDispatchable) throws PresentationModelException
    {
        Object myFeatureImpl = null;
        MyWorker worker = new MyWorker(aDispatchable);
        worker.execute();
        while (!worker.isDone())
        {
            myFeatureImpl = rootFeatureImpl;
        }
        return myFeatureImpl;
    }
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477189
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема опять в том, как использовать SwingWorker при условии когда метод не void.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477200
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirПроблема опять в том, как использовать SwingWorker при условии когда метод не void.
Это не проблема.
Очевидно что нужно SwingWorker<ResultType, IntermediateResultType> вместо SwingWorker<Void, IntermediateResultType>
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477204
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Я про ожидание
Код: java
1.
2.
3.
4.
5.
6.
        worker.execute();
        while (!worker.isDone())
        {
            myFeatureImpl = rootFeatureImpl;
        }
        return myFeatureImpl;
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477221
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotir, если вам нужна помощь, совет или подсказка, то сделайте над собой усилие и постарайтесь внятно и подробно обрисовать суть вашего вопроса. Либо ждите может кто другой ответить. Играть в "угадайте что я имел ввиду" никакого желания у меня сейчас нет.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477227
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

суть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground().
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477232
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иначе говоря, стоит задача корректно получить возвращаемое значение в методе, в котором вызывается SwingWorker.execute(), при этом в процессе получения значения требуется изменять текст ПрогрессБара (который находится в indeterminate mode).
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477234
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotirсуть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground().
Что такое "данная реализация" мне не понятно. Покажите ваш код, где используется и промежуточное значение и результат.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477236
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirBlazkowicz,

Я про ожидание
Код: java
1.
2.
3.
4.
5.
6.
        worker.execute();
        while (!worker.isDone())
        {
            myFeatureImpl = rootFeatureImpl;
        }
        return myFeatureImpl;


Такого кода при искпользовани SwingWorker быть не должно. Его можно добиться только с помощью SecondaryLoop. Выберите что-то одно.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477238
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirИначе говоря, стоит задача корректно получить возвращаемое значение в методе, в котором вызывается SwingWorker.execute(), при этом в процессе получения значения требуется изменять текст ПрогрессБара (который находится в indeterminate mode).

Нельзя просто так запустить SwingWorker и вернуть его результат. Нужно зарефакторить весь код, так чтобы обработка результата вызывалась из метода done.

То что вы хотите делается без SwingWorker-а с помощью SecondaryLoop.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477240
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczBusotirсуть вопроса в том, что ProgressBar.setString() срабатывает только после окончания долгоиграющей загрузки "холдингов". То есть SwingWorker.process() в данной реализации почему то не выводит промежуточные результаты в Прогресс Бар. В интернете я нашел примеры лишь с Void doInBackground().
Что такое "данная реализация" мне не понятно. Покажите ваш код, где используется и промежуточное значение и результат.

Данная реализация - тот код что я привел. Промежуточные значения - те, которые передаются методом publish() в каждом проходе цикла for. Результат - то что в return метода handle().
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477248
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

с SecondaryLoop я пробовал, но результат был тот же - выводился текст только после окончания загрузки холдингов.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477253
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotirс SecondaryLoop я пробовал, но результат был тот же - выводился текст только после окончания загрузки холдингов.
Как всегда подробно и предметно.
Ещё раз повторяю. Код вида

Код: java
1.
2.
3.
4.
5.
Result getResultInEventDispatchThread(){
   SwingWorkter.execute();
   SwingWorkter.waitForResults();
   return SwingWorkter.result();
}


...смысла не имеет, так как блокирует Event Dispatch Thread до окончания обработки фоновой задачи, чего собственно SwingWorkter и должен помочь избежать.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477307
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ниже мой код с 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.
    public Object handle(final RootEntityImpl aDispatchable) throws PresentationModelException
    {
            guiLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
            // Spawn a new thread to do the background work
            new Thread()
            {
                public void run()
                {
                    Jas myRoot = (Jas) itsModelMap.getRelatedNode(aDispatchable);
                    HoldingList myHoldingList = (HoldingList) itsNodeFinder.findNode(myRoot, HoldingList.class);
                    myFeatureImpl = null;
                    if (myHoldingList != null && !myHoldingList.isAbsent())
                    {
                        myFeatureImpl = new RootEntityImpl.International();
                        // Attach the Feature to its RootEntity.
                        aDispatchable.addFeature(RootEntity.FEATURE_INTERNATIONAL, myFeatureImpl);
                        itsModelMap.relate(myFeatureImpl, myHoldingList);
                        // For now build all the holdings with company information
                        try
                        {
                            Holding myHolding = new Holding();
                            Map[] myResults = itsConnection.searchOneLevel(myHoldingList.getDN(), "(objectClass=" + myHolding.getManagedObjectName() + ")", null);
                            for (int i = 0; i < myResults.length; i++)
                            {
                                myHolding.fill(myResults[i]);
                                myHoldingList.addChild(myHolding);
                                buildSubTree(myHolding);
                                myHolding = new Holding();
                            }
                        }
                        catch (ComException anEx)
                        {
                        }
                    }
                    // Prevent exit() from run before start()
                    EventQueue.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            guiLoop.exit();
                        }
                    });
                }
            }.start();
            // Enter the loop to block the current event
            // handler, but leave UI responsive
            guiLoop.enter();
            return myFeatureImpl;
    }
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38477361
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busotir,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 
for (int i = 0; i < myResults.length; i++){
     myHolding.fill(myResults[i]);
     myHoldingList.addChild(myHolding);
     buildSubTree(myHolding);
     myHolding = new Holding();

     SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                  ProgressIndicator.setString(progress)
            }
      });

}
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478017
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Такой способ уже пробовал, не помогло. Сейчас пробую скрестить SecondaryLoop и SwingWorker, вроде чтото начинает получаться с ГУИ.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478069
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
package ru.sql;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.*;

/**
 * This class represents ...
 */
public class SecondaryLoopProgress
{
    static JProgressBar progressBar;

    public static void main(String[] args)
    {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        progressBar = new JProgressBar();
        frame.add(progressBar, BorderLayout.CENTER);
        Button button = new Button("Run in background");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    String s = longRunningProcess();
                    JOptionPane.showMessageDialog(frame, "Method returns " + s);
                } catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(300, 100);
        frame.setVisible(true);
    }

    private static String longRunningProcess() throws ExecutionException, InterruptedException
    {
        final int loops = 100;
        progressBar.setMaximum(loops);
        progressBar.setStringPainted(true);
        final SecondaryLoop secondaryLoop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();

        ExecutorService executorService = Executors.newFixedThreadPool(1);
        Future<String> future = executorService.submit(new Callable<String>()
        {
            public String call() throws Exception
            {
                for (int i = 0; i <= loops; i++)
                {
                    Thread.sleep(50);
                    final int v = i;
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        public void run()
                        {
                            progressBar.setValue(v);
                            progressBar.setString(v + "%");
                        }
                    });
                }
                secondaryLoop.exit();
                return "Result";
            }
        });
        secondaryLoop.enter();
        return future.get();
    }
}



Обратите внимание на коментарии выше, такое тривиальное использование secondaryLoop не безопасно.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478193
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поставил indeterminate mode в false перед выводом текста в прогрессбар, все корректно заработало без SwingWorker. Я так понимаю, нет разницы, использовать SwingUtilities или EventQueue. Спасибо за помощь и обилие комплиментов.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478216
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirПоставил indeterminate mode в false перед выводом текста в прогрессбар, все корректно заработало без SwingWorker.
Ну, вот опять. Добавляем
Код: java
1.
progressBar.setIndeterminate(true);


...в мой пример. И о, чудо! Работает и без SwingWorker. indeterminate к проблеме отношения не имеет.

BusotirЯ так понимаю, нет разницы, использовать SwingUtilities или EventQueue.
Принципиальной нет.

BusotirСпасибо за помощь и обилие комплиментов.
О каких комплиментах речь? Я, вроде, здерживаюсь как могу.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478388
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте без механизма Future сделать с indeterminate mode true. Смысл мне заливать, сейчас вот еще раз проверил (setValue закомментировал, только setString используется). Ну не выводит текст в indeterminate mode.
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478425
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusotirПопробуйте без механизма Future сделать с indeterminate mode true.
:) Даже пробовать не хочу. И так знаю, что будет работать. Перепишите мой пример чтобы не работало.

BusotirСмысл мне заливать, сейчас вот еще раз проверил (setValue закомментировал, только setString используется).
Проблема в чем-то другом. А вы пеняете на совершенно не связанные с проблемой методы и свойства.

BusotirНу не выводит текст в indeterminate mode.
Код: java
1.
progressBar.setStringPainted(true);
...
Рейтинг: 0 / 0
JProgressBar indeterminate mode и SwingWorker
    #38478664
Busotir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BusotirНу не выводит текст в indeterminate mode.
Код: java
1.
progressBar.setStringPainted(true);

[/quot]

Не помогло. Ну да ладно.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / JProgressBar indeterminate mode и SwingWorker
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]