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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с окном 
:(
    Опции темы
Разгильдяй
Дата 1.9.2004, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Программа выполняет длительтные действия, на момент выполнения надо вывести информационное окно. Окно выводится, а текст в нем, нет... (

Написал тест, когда проваливаюсь в выполнение сразу, текста нет, во втором случае, при изменении текста по по кнопке все работает. Не понимаю, в чем дело. ПОМОГИТЕ!!! )))

Код


import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class testWait
{
   static JFrame frame;
   static long count = -1;
   static String msg = "<html>Идет обработка данных.<br>Ждите...";

   public static void addComponentsToPane( Container pane )
   {
       pane.setLayout( null );

       final JButton b1 = new JButton( "myWaitDialog" );
       final JButton b2 = new JButton( "myWaitDialog button" );
       final JButton b3 = new JButton( "chenge message WaitDialog" );

       pane.add( b1 );
       pane.add( b2 );
       pane.add( b3 );

       b1.addActionListener( new ActionListener()
       {
           public void actionPerformed( ActionEvent e )
           {
               myWaitDialog.Show( frame, msg );
               System.out.println( "Start work..." ); System.out.flush();
               long start = System.currentTimeMillis();
               long end = System.currentTimeMillis();
               count = ( end - start ) / 1000;
               while ( count <= 5 )
               {
                   end = System.currentTimeMillis();
                   if ( count < ( ( end - start ) / 1000 ) )
                   {
                       count = ( end - start ) / 1000;
                       myWaitDialog.setText( "Count = " + count );
                       System.out.println( "Work " + count ); System.out.flush();
                   }
               }
               myWaitDialog.Hide();
               count = -1;
           }
       } );
       b2.addActionListener( new ActionListener()
       {
           public void actionPerformed( ActionEvent e )
           {
               myWaitDialog.Show( frame, msg );
               count = 0;
           }
       } );
       b3.addActionListener( new ActionListener()
       {
           public void actionPerformed( ActionEvent e )
           {
               if ( count >= 0 )
               {
                   count++;
                   myWaitDialog.setText( "Count = " + count );
                   if ( count == 6 )
                   {
                       count = -1;
                       myWaitDialog.Hide();
                   }
               }
           }
       } );

       Insets insets = pane.getInsets();
       Dimension size = b1.getPreferredSize();
       b1.setBounds( 25 + insets.left, 5 + insets.top, size.width, size.height );
       size = b2.getPreferredSize();
       b2.setBounds( 25 + insets.left, 40 + insets.top, size.width, size.height );
       size = b3.getPreferredSize();
       b3.setBounds( 25 + insets.left, 75 + insets.top, size.width, size.height );
   }

   private static void createAndShowGUI()
   {
       JFrame.setDefaultLookAndFeelDecorated( true );
       frame = new JFrame( "Test Wait Window" );
       frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
       addComponentsToPane( frame.getContentPane() );
       Insets insets = frame.getInsets();
       frame.setSize( 250 + insets.left + insets.right, 150 + insets.top + insets.bottom );
       frame.setVisible( true );
   }

   public static void main( String[] args )
   {
       javax.swing.SwingUtilities.invokeLater( new Runnable()
       {
           public void run()
           {
               createAndShowGUI();
           }
       } );
   }
}

class myWaitDialog extends JDialog
{
   static myWaitDialog dialog;
   JLabel label = new JLabel();
   final Dimension size = new Dimension( 300, 200 );

   myWaitDialog( JFrame parent )
   {
       super(parent);
       label.setText( "Подождите..." );
       init();
   }

   myWaitDialog( JFrame parent, String msg )
   {
       super(parent, false);
       label.setText( msg );
       init();
   }

   private void init()
   {
       setTitle( "Подождите..." );
       Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
       setSize( size );
       setBounds(( screenSize.width - size.width ) / 2, ( screenSize.height - size.height ) / 2, size.width, size.height);
       label.setPreferredSize( size );
       label.setSize( size );
       label.setHorizontalAlignment( JLabel.LEFT );
       JPanel panel = new JPanel();
       panel.setPreferredSize( size );
       panel.setSize( size );
       panel.setBorder(new EmptyBorder(5, 50, 5, 5));
       panel.setLayout( new BorderLayout() );
       panel.setIgnoreRepaint( false );
       panel.add(label, BorderLayout.CENTER);
       getContentPane().add( BorderLayout.CENTER, panel );
       this.addWindowListener(new WindowAdapter()
       {
           public void windowClosing( WindowEvent e )
           {
               setVisible( false );
           }
       });
   }

   public static void Show(JFrame parent)
   {
       if ( dialog == null )
       {
           dialog = new myWaitDialog( parent );
       }
       dialog.setVisible( true );
   }

   public static void Show(JFrame parent, String msg )
   {
       if ( dialog == null )
       {
           dialog = new myWaitDialog( parent, msg );
       }
       dialog.setVisible( true );
       dialog.repaint();
   }

   public static void Hide()
   {
       if ( dialog != null )
       {
           dialog.setVisible( false );
           try
           {
               dialog.finalize();
               dialog = null;
           } catch ( Throwable throwable )
           {
               throwable.printStackTrace();
           }
       }
   }

   public static void setText( String msg )
   {
       if ( dialog != null )
       {
           dialog.setModal( true );
           dialog.label.setText( msg );
           dialog.repaint();
       }
   }
}



PM MAIL   Вверх
Domestic Cat
Дата 1.9.2004, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Попробуй во все добавить нечто наподобие такого:

Код

       b1.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent e )
            {
                myWaitDialog.Show( frame, msg );
               Thread thread = new Thread()
               {
                   public void run()
                   {
                        System.out.println( "Start work..." ); System.out.flush();
                        long start = System.currentTimeMillis();
                        long end = System.currentTimeMillis();
                        count = ( end - start ) / 1000;
                        while ( count <= 5 )
                        {
                            end = System.currentTimeMillis();
                            if ( count < ( ( end - start ) / 1000 ) )
                            {
                                count = ( end - start ) / 1000;
                               Runnable update = new Runnable ()
                               {
                                   public void run()
                                   {
                                        myWaitDialog.setText( "Count = " + count );
                                   }
                               };
                               SwingUtilities.invokeAndWait(update);
                                System.out.println( "Work " + count ); System.out.flush();
                            }
                        }
                       Runnable update2 = new Runnable ()
                       {
                           public void run()
                           {
                                myWaitDialog.Hide();
                           }
                       };
                       SwingUtilities.invokeAndWait(update2);
                        count = -1;
                   }
               };
               thread.start();
            }
        } );



--------------------

PM   Вверх
Разгильдяй
Дата 1.9.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я примерно так в одной проге и делал. Все работает. )
Проблема в том, что в программе должно работать не по кнопке (в потоке), а просто в разных местах. Большое кол-во данных обрабатывается, и по об'ему большое, в static засовывать не хочется... (
PM MAIL   Вверх
Domestic Cat
Дата 1.9.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Создай тред, установи его листенером на нужные поля. Что-то вроде ChangeListener.


--------------------

PM   Вверх
Разгильдяй
Дата 2.9.2004, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не совсем понятно как тред установить на листер, вчера весь вечер пытался, не получается... sad.gif
PM MAIL   Вверх
Domestic Cat
Дата 2.9.2004, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Попросту, создай тред, который будет опрашивать нужные поля у того объекта, который
чего-то там долго делает. Что-то вроде: спим (0.5 сек) -> опрашиваем поля -> если изменились - изменяем диалог -> спим(). Можно и получше что-то придумать.



--------------------

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

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

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


 




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


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

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