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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужны часики :), картинка с часиками на время выполнения  
:(
    Опции темы
SySaD
Дата 23.4.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго дня.

Возникла интересная проблема которую пока не знаю как решить.
Вкратце: в проекте несколько модулей
есть объект, описывающий состояние системы, далее
- процесс-менеджер, имеющий public функцию processGUIaction(int ActionCode), которая в зависимости от параметра анализирует состояние системы, готовит/изменяет данные и вызывает функцию перерисовки GUI
- GUI, имеющий открытую функцию drawPageOnSs(), которая анализирует состояние системы, формирует нужное окошко и отображает его
- посредник между процесс-менеджером и GUI, передающий обращения одного к другому

определенные события в GUI вызывают обращения к процесс-менеджеру

обновлением данных в GUI занимается эта функция, упрощенно выглядящая как показано ниже
Код

    public void drawPageOnSS() {
            //ss-объект состояние ситемы
            if (ss == null) return;
            if (!this.isVisible()) this.setVisible(true);
            fillPageData(ss.getWindowId()); //заполнение данными нужной странички
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    if (currentCardNum < 10)
                        ((CardLayout) mainCardPane.getLayout()).show(mainCardPane, ((Integer) currentCardNum).toString()); //делаем активной нужную страничку
                 //далее вырезано
                }
            });
    }


все работает нормально
далее
в 3 местах проходит большая работа по выборке данных из базы и подготовке их для вывода на экран. занимает от 5 до 30 секунд. на эти время надо вывести на экран поверх основного фрейма gif с часиками smile причем не блокируя работу программы ессно

я набросал навскидку класс:
Код

public class TimeDialog extends JDialog {
    public TimeDialog() throws HeadlessException {
        super();
        setModal(false);
        Container p = getContentPane();
        JLabel lb = new JLabel();
        lb.setIcon(new ImageIcon(getClass().getResource("/storm/gui/img/medved_time.gif")));
        lb.setText("<html>Подождите<br>подготавливаются данные...");
        p.add(lb);
        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    }

    public void pack() {
        super.pack();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = getSize();
        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
    }
}


и попробовал его запускать в отдельную нить, для того чтобы он был поверх всех окон но не блокировал выполнение программы. И тут возникла ситуация, что диалог рисуется, но без элементов внутри, просто серый прямоугольничек. Если я вызываю тупо, например:
Код

TimeDialog timeDlg = new TimeDialog();
timeDlg.pack();
timeDlg.setVisible(false);

то все хорошо - анимэшка играет, все рисует, но останавливается вся программа пока не закрою окошко.

Может у кого есть идеи. Понимаю что скорее всего это нехватка знаний. Но жду идей.

спасибо всем
PM MAIL   Вверх
powerOn
Дата 23.4.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Попробуйте запускать TimeDialog в новом потоке.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
SySaD
Дата 24.4.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в GUI через посредник вызываю такую функцию для примера

    public void showProgress() {
        final Logger logger = Logger.getLogger("storm");
        logger.debug("show begin");
                final TimeDilog dlg = new TimeDilog();
                dlg.pack();
                Thread t = new Thread() {
                    public void run() {
                        dlg.setVisible(true);
                    }
                };
                t.start();
        }

и повесил вызов напрямую на одну из кнопок

получились результаты
1) прямой вызов с кнопки:
user posted image
2) вызов через showProgress
user posted image
если использую invokeLater то отрисовывается но уже после подготовки данных
(в процесс-менеджере на кнопку "выбрать" срабатывает 1) вызов showProgress 2) подготовка данных 3) hideProgress 4) вызов drawPageOnSs )
PM MAIL   Вверх
SySaD
Дата 24.4.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В догонку: диаог с часами отрисовывается после того как отрабатывает drawPageOnSs. видимо это связано с очередью событий, но решения все равно не знаю. invoke тут видимо ни при чем... 
PM MAIL   Вверх
powerOn
Дата 24.4.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(SySaD @  24.4.2008,  12:21 Найти цитируемый пост)
1) вызов showProgress 2) подготовка данных 3) hideProgress 4) вызов drawPageOnSs

Это все вынесите в отдельный поток. Обработчик, повешенный на кнопку, должен только создать рабочий поток, который всеми перечисленными действиями займется. Если он будет выполнять длительное действие, то UI подвиснет, поскольку выполнение идет в потоке обработки событий.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
SySaD
Дата 24.4.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да обработка и так висит в отдельном потоке
GUI не подвисает а ждет пока процесс-менеджер подготовит данные для отображения и вызовет drawPageOnSs

обработка кнопок вообще минимальна:
например на кнопку "выбрать"
Код

        if (e.getActionCommand().equalsIgnoreCase("select")) {
            logger.debug("Was selected `select )))`");
            //--------
            if (intCopy == null) logger.debug("intCopy is null");
            if (intCopy.ss == null) logger.debug("butL ss is null");
            if (intCopy.allOsvidetTable == null) logger.debug("intCopy.allOsvidetTable is null");
            if (intCopy.ss.getCurrentSurvey() == null) logger.debug("intCopy.ss.getCurrentSurvey() is null");
            //--------
            if (intCopy.allOsvidetTable.getSelectedRow() != -1) {
                intCopy.ss.getCurrentSurvey().setId(
                        (((AllOsvidetTabelModel) intCopy.allOsvidetTable.getModel()).getRowObject(
                                intCopy.allOsvidetTable.getSelectedRow())).getId()
                );
                logger.debug("proccessGUIAction ACTION_SELECT_SURVEY");
                intCopy.p.proccessGUIAction(Constants.ACTION_SELECT_SURVEY);
                //setMode2();
                //intCopy.currentCardNum = 2;
            } else {
                JOptionPane.showInternalMessageDialog(intCopy.contentPane, "You must select the row in the table!");
            }
        }


ключевое здесь это
proccessGUIAction(Constants.ACTION_SELECT_SURVEY);
через класс-посредник вызывается процесс-менеджер, который обрабатывает нужные данные

мне интересно почему не отриовывается TimeDialog или отрисовывается после выполнения drawPageOnSs

если нужен код - то только в личку
PM MAIL   Вверх
powerOn
Дата 24.4.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Посмотрите вот на этот пример:

Код

package test;

import java.util.logging.Level;
import java.util.logging.Logger;

public class NewJFrame extends javax.swing.JFrame
{
    public class NewJDialog extends javax.swing.JDialog
    {
        public NewJDialog(java.awt.Frame parent, boolean modal)
        {
            super(parent, modal);
            initComponents();
        }

        private void initComponents()
        {
            jProgressBar1 = new javax.swing.JProgressBar();
            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
            jProgressBar1.setIndeterminate(true);
            getContentPane().add(jProgressBar1, java.awt.BorderLayout.CENTER);
            pack();
        }
        private javax.swing.JProgressBar jProgressBar1;
    }

    public NewJFrame()
    {
        initComponents();
    }

    private void initComponents() {

        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new java.awt.FlowLayout());

        jButton1.setText("Execute Long Action (5 sec)");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
        getContentPane().add(jButton1);

        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
    {
        System.out.println("Работа в потоке рассылки сообщение начата.");
        final NewJFrame.NewJDialog dialog = new NewJFrame.NewJDialog(this, true);

        new Thread(new Runnable()
        {
            public void run()
            {
                System.out.println("(Поток 1) Запускаем диалог");
                dialog.setVisible(true);
                System.out.println("(Поток 1) Поток завершен.");
            }
        }).start();

        new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    System.out.println("(Поток 2) Запускаем длительную задачу.");
                    Thread.sleep(5000);
                    System.out.println("(Поток 2) Длительная задача завершена.");
                }
                catch (InterruptedException ex)
                {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
                System.out.println("(Поток 2) Закрываем диалог");
                dialog.setVisible(false);
                System.out.println("(Поток 2) Поток завершен.");
            }
        }).start();

        System.out.println("Работа в потоке рассылки сообщение завершена.");
    }

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
}


Это сообщение отредактировал(а) powerOn - 24.4.2008, 17:21


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
SySaD
Дата 25.4.2008, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, пример понятен, спасибо.

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

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

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

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


 




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


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

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