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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> связать swingworker и progressbar, синхронизировать действие потоков 
V
    Опции темы
lBugl
Дата 26.10.2010, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вроде и много где почитал, но как-то сё равно не могу уловить до конца суть.
в общем не получается закрыть прогрессбар по завершению воркера.
подскажите где что не так, точнее как исправить?

Код

package progressBar;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

class ProgressBar extends JDialog
{
    private JProgressBar progress;
    public ProgressBar(JFrame parent )
    {
        super(parent, true);
        JPanel contentPane = new JPanel(new GridLayout(1,1));
        progress = new JProgressBar();
        progress.setIndeterminate(true);
        contentPane.add( progress );
        setContentPane(  contentPane  );
        setSize( 100, 50 );
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(parent);
        setVisible(true);
    }
}

class sWorker extends SwingWorker<Object, Object>{

    JDialog pBar;

    public sWorker(JDialog pb) {
        pBar = pb;
    }

    @Override
    protected Object doInBackground() throws Exception {
        for(int i = 0; i < 5; i++){
            Thread.sleep(1000);
            System.out.println(i);
        }
        return null;
    }

    @Override
    protected void done() {
        pBar.dispose();
    }


    
}

public class Main extends JFrame{

    JButton bStart;
    JPanel mainPanel;
    JFrame thisFrame;

    public Main(){
        super();
        thisFrame = this;
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        initComponent();
        setContentPane(mainPanel);
        setSize(300,100);
        setVisible(true);
    }

    private void initComponent(){
        mainPanel = new JPanel(null);

        bStart = new JButton("Старт");
        bStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ProgressBar pb = null; //если инициализировать здесь sw начнёт работу только после закрытия диалога.
                sWorker sw = new sWorker(pb);
                sw.execute();
                pb = new ProgressBar(thisFrame);
                //while(!sw.isDone()){} //так не выходит
                //pb.dispose();
            }
        });
        bStart.setBounds(150, 40, 100, 20);
        mainPanel.add(bStart);
    }

    public static void main(String args[]){
        new Main();
    }
}

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


Эксперт
***


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

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



Код

package progressbar;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

class ProgressBar extends JDialog {
    private JProgressBar progress;

    public ProgressBar(JFrame parent) {
        super(parent, true);
        JPanel contentPane = new JPanel(new GridLayout(1, 1));
        progress = new JProgressBar();
        progress.setIndeterminate(true);
        contentPane.add(progress);
        setContentPane(contentPane);
        setSize(100, 50);
        setResizable(false);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setLocationRelativeTo(parent);
    }
}

class sWorker extends SwingWorker<Object, Object> {
    JDialog pBar;

    public sWorker(JDialog pb) {
        pBar = pb;
    }

    @Override
    protected Object doInBackground() throws Exception {
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println(i);
        }
        return null;
    }

    @Override
    protected void done() {
        pBar.dispose();
    }

}

public class Main extends JFrame {
    JButton bStart;
    JPanel mainPanel;
    JFrame thisFrame;

    public Main() {
        super();
        thisFrame = this;
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        initComponent();
        setContentPane(mainPanel);
        setSize(300, 100);
        setVisible(true);
    }

    private void initComponent() {
        mainPanel = new JPanel(null);
        bStart = new JButton("Старт");
        bStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // инициализировать можно
                ProgressBar pb = new ProgressBar(thisFrame);
                sWorker sw = new sWorker(pb);
                sw.execute();
                //и только показывать надо в последнюю очередь
                pb.setVisible(true); 
            }
        });
        bStart.setBounds(150, 40, 100, 20);
        mainPanel.add(bStart);
    }

    public static void main(String args[]) {
        new Main();
    }
}




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


Шустрый
*


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

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



спасибо
видать метод setVisible() более коварный чем я представлял... =)
я думал он просто меняет значение поля и делает видимым уже существующий(инициализированный) объект, но видать там процессы по сложнее(толи конструктор вызывается здесь, а сама ссылка инициализируется раньше, толи ещё чё)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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