Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jProgressbar не отображается 
:(
    Опции темы
KazOFF
Дата 9.7.2010, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.6.2007
Где: Раменское

Репутация: нет
Всего: нет



Проблема в следующем: диалог появляется но на нём не появляется прогрессбар, а появляется он только после завершения всех итераций.
Код

*****
    final JDialog dlg = new JDialog(this, "Progress Dialog", true);
    dpb = new JProgressBar(0, 500);
    dlg.add(BorderLayout.CENTER, dpb);
    dlg.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    dlg.setSize(300, 75);
    dlg.setLocationRelativeTo(this);

    Thread t = new Thread(new Runnable() {
      public void run() {
        dlg.setVisible(true);
      }
     });
    t.start();

*****

for(int i=0;i<mass.length;i++)
            {           
                     dpb.setValue(i);
             }
   dlg.setVisible(false);        

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

PM MAIL   Вверх
jk1
Дата 9.7.2010, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Цитата

почему не отображается даже прогрессбар.

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

 public void run() {
        dlg.setVisible(true);
      }

на
Код

 public void run() {
       SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                dlg.setVisible(true);
            }
        });
      }

Есть хороший мануал по этому поводу непосредственно от вендора.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
soulcub
Дата 9.7.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

Репутация: 2
Всего: 2



Код

import java.awt.BorderLayout;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class NewInterface extends JFrame {

    NewInterface() {

        this.setVisible(true);
        this.setBounds(10, 10, 400, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        final JDialog dlg = new JDialog(this, "Progress Dialog", true);
        final JProgressBar dpb = new JProgressBar(0, 500);
        dlg.add(dpb);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setSize(300, 75);
        dlg.setLocationRelativeTo(this);

        Thread t = new Thread(new Runnable() {

            public void run() {
                for (int i = 0; i < 500; i++) {
                    try {
                        Thread.sleep(10);
                        dpb.setValue(i);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(NewInterface.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                dlg.setVisible(false);
            }
        });

        t.start();
        dlg.setVisible(true);

    }

    public static void main(String s[]) {
        new NewInterface();
    }
}


Немного изменил Ваш код. Может нужно нечто такое?

Это сообщение отредактировал(а) soulcub - 9.7.2010, 23:05
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
KazOFF
Дата 10.7.2010, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.6.2007
Где: Раменское

Репутация: нет
Всего: нет



jk1, после этих операций фрейм появляется только после прохождения цикла.

soulcub, спасибо за код. нечто подобное надо было. просто перенес цикл в  run() и всё заработало. Но остался небольшой вопрос: можно ли создать метод, в который вынести dpb.setValue(i) и оставить его в потоке, а вызывать уже в обычном цикле?
PM MAIL   Вверх
soulcub
Дата 10.7.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

Репутация: 2
Всего: 2



KazOFF, вам нужно понять что такое поток и для чего он нужен. 
Цитата(KazOFF @  10.7.2010,  00:03 Найти цитируемый пост)
можно ли создать метод, в который вынести dpb.setValue(i) и оставить его в потоке, а вызывать уже в обычном цикле? 

Толку? Поток нужен для выполнения постоянной роботы, например какого-то вечного цикла. Для чего в него выносить одну функцию?

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

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


--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
Connie
Дата 10.7.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 382
Регистрация: 12.8.2008

Репутация: 8
Всего: 9



PM MAIL WWW   Вверх
KazOFF
Дата 10.7.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 6.6.2007
Где: Раменское

Репутация: нет
Всего: нет



Connie, спасибо конечно, но это то место куда я обратился в первую очередь.

soulcub, цель была достигнута после Вашей помощи, а доп. вопрос я задал только ради интереса. Еще раз спасибо.
PM MAIL   Вверх
soulcub
Дата 11.7.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 2.2.2010
Где: Винница, Украина

Репутация: 2
Всего: 2



KazOFF, ок, тогда тему можно помечать как решённую)
--------------------
Так давай же, поспеши!Отыскать СВОЙ куб души!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.