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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ProgressMonitor 
:(
    Опции темы
akula84
Дата 22.3.2005, 13:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Создаю ProgressMonitor,во время выполнения программы появляется окошко ProgressMonitor, но оно не перерисовыватся(перерисовываю методом см.ниже). В чем может быть проблема?

Код

  void setMonitorValue(int i){
    try{
      System.out.println(i);
      monitor.setProgress(i);
      monitor.setMillisToDecideToPopup(2 * 10);
      monitor.setNote("Осталось " + (i-1) + " строк");

      if(monitor.isCanceled()){
        monitor.setProgress(rs.getRow());
        monitor.close();
      }
    }catch(Exception ex){ex.printStackTrace();}
    
  }





  Вверх
DarkDS
Дата 22.3.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



ОТкуда вызывается прорисовка прогресса?
PM MAIL   Вверх
akula84
Дата 22.3.2005, 14:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











У меня просто из одного потока, из того же, где происходят и вычисления.
Я так понимаю ошибка где-то тут... а вот как конкретно решить проблему?
  Вверх
DarkDS
Дата 22.3.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Самый простой способ вызывать изменения в ivokelater.
+ все вычисления не производить в евент треде.
Добавлено @ 15:31
ЗЫ. если что - могу ближе к вечеру маленький пример накидать...
PM MAIL   Вверх
akula84
Дата 22.3.2005, 15:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Если не сложно-скинь, плиз. А то, я что-то совсем запутался.
Спасибо за помощь
  Вверх
Guest
Дата 22.3.2005, 23:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот простеиший пример. Правда чутка читерский, так как нет основного фрейма и вычисление идет в основном треде (с методом майн) и не касается Евент треда. Но основную идею передает.
В евент треде нужно само вычисление выносить за пределы треда (запускать в отдельном треде).

Код

import java.awt.GridLayout;

import javax.swing.*;

public class JProgressDlg extends JDialog
{
    private JProgressBar progress;
    public JProgressDlg()
    {
        JPanel contentPane = new JPanel( new GridLayout(1,1) );
        progress = new JProgressBar(0, 100);
        contentPane.add( progress );
        setContentPane(  contentPane  );
        setSize( 100, 50 );
        progress.setValue( 0 );
    }
    
    public void setProgress( int pr )
    {
        progress.setValue( pr );
    }

    public static void main(String[] args)
    {
        final JProgressDlg dlg = new JProgressDlg();
        dlg.show();
        for(int i = 0; i < 100; i++)
        {
            final int pr = i;
            try
            {
                SwingUtilities.invokeLater( new Runnable()
                        {
                            public void run()
                            {
                                dlg.setProgress( pr );
                            }
                        });
                Thread.sleep( 100 );
            }
            catch( Exception ex )
            {
            }
        }
    }
}

  Вверх
DarkDS
Дата 22.3.2005, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Предидущий пост был мой. Залогинится забыл... Сейчас попробую посложнее пример накидать.
PM MAIL   Вверх
DarkDS
Дата 23.3.2005, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Вот накидал. Итак. Имеем 3-и класса. Майн фрейм (JTestFrame) из которого по нажатию кнопки будет вызыватся рабочий тред и прогресс диалог.
1. JTestFrame - основной фрейм.
Код

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class JTestFrame extends JFrame implements ActionListener
{
    public JTestFrame()
    {
        super("ProgressTest");
        
        JPanel contentPanel = new JPanel( new BorderLayout() );
        JButton button = new JButton("Run Work");
        button.addActionListener( this );
        contentPanel.add(button, BorderLayout.CENTER);
        JButton close = new JButton("Close");
        close.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
        contentPanel.add(close, BorderLayout.SOUTH);
        setContentPane( contentPanel );
        setSize( 50, 100 );
        setDefaultCloseOperation( DISPOSE_ON_CLOSE );
    }
    
    public void actionPerformed(ActionEvent e)
    {
        JProgressDlg dlg = new JProgressDlg(this);
        /*
        Мы не можем запускать работу тут,
        так как это вызовет остановку Event потока
        и остановит перерисовку компонентов.
        Чтобы этого избежать воспользуемся
        отдельным потоком.
        */
        Thread work = new WorkThread( dlg );
        work.start();
    }
    
    public static void main(String[] args)
    {
        JFrame frame = new JTestFrame();
        frame.show();
    }
}


2. JProgressDlg - диалог прогресса.
Код

import java.awt.GridLayout;

import javax.swing.*;

public class JProgressDlg extends JDialog
{
    private JProgressBar progress;
    public JProgressDlg( JFrame parent )
    {
        super(parent, true);
        JPanel contentPane = new JPanel( new GridLayout(1,1) );
        progress = new JProgressBar(0, 100);
        contentPane.add( progress );
        setContentPane(  contentPane  );
        setSize( 100, 50 );
        progress.setValue( 0 );
    }
    
    public void setProgress( int pr )
    {
        progress.setValue( pr );
    }
}


3. WorkThread - место где выполняется вся работа.
Код

import javax.swing.SwingUtilities;

public class WorkThread extends Thread
{
    private JProgressDlg progress;
    public WorkThread( JProgressDlg progress )
    {
        /*
        Это для облегчения работы с прогрессом.
        Это не лудший вариант, но самый простой
        в исполнении. Возможны другие варианты
        обращения. К примеру через механизм
        листенеров.
        */ 
        this.progress = progress;
    }

    public void run()
    {
        try
        {
            /*
            Покажем прогресс диалог.
            Чтобы работа продолжалась нужно вызвать показ в отдельном треде.
            */
            SwingUtilities.invokeLater( new Runnable()
                    {
                        public void run()
                        {
                            progress.show();
                        }
                    });
            //Выполняем какую то работу...
            for(int i = 0; i < 100; i++)
            {
                /*
                Так как в инвок - другой тред,
                то там могут быть использованны только
                final переменный или пропети текущего
                класса. 
                */
                final int pr = i;
                /*
                Так как изменения статуса в прогрессе вызывет
                изменение в Эвент треде, то это может вызвать
                лок тредов. Нужно либо синхронизировать,
                либо вызывать в invoke методе. 
                */ 
                SwingUtilities.invokeLater( new Runnable()
                        {
                            public void run()
                            {
                                progress.setProgress( pr );
                            }
                        });
                //Эмуляция упорной работы.
                Thread.sleep( 100 );
            }

            //Закроем диалог.
            SwingUtilities.invokeLater( new Runnable()
                {
                    public void run()
                    {
                        progress.dispose();
                    }
                });
        }
        catch( Exception ex )
        {
        }
    }
}

Добавлено @ 00:10
ЗЫ. По идее нужно еще отлавливать закрытие прогресс диалога, но этого я не делал.
Думаю на данном этапе как примера этого хватит smile
Если что - можно будет еще что нибудь сделать smile
PM MAIL   Вверх
akula84
Дата 24.3.2005, 12:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











При использовании
Код

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


появление progressMonitor происходит только в самом конце выполнения задания.(почему так происходит smile )

  Вверх
DarkDS
Дата 24.3.2005, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Скорее всего задание выполняется в контексте Евент треда.
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.0465 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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