Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > jProgressbar не отображается


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

*****
    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);        

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

Автор: jk1 9.7.2010, 20:09
Цитата

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

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

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

на
Код

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

Есть хороший http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/concurrency/index.html по этому поводу непосредственно от вендора.

Автор: soulcub 9.7.2010, 20:19
Код

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();
    }
}


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

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

soulcub, спасибо за код. нечто подобное надо было. просто перенес цикл в  run() и всё заработало. Но остался небольшой вопрос: можно ли создать метод, в который вынести dpb.setValue(i) и оставить его в потоке, а вызывать уже в обычном цикле?

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

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

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

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


Автор: Connie 10.7.2010, 21:14
http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/components/progress.html

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

soulcub, цель была достигнута после Вашей помощи, а доп. вопрос я задал только ради интереса. Еще раз спасибо.

Автор: soulcub 11.7.2010, 12:22
KazOFF, ок, тогда тему можно помечать как решённую)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)