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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает обработчик 
:(
    Опции темы
AntonSaburov
Дата 13.5.2008, 16:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Вопрос задал Aehn - что-то у него не получается с публикацией

Есть такая проблема: при возникновении событий в описанном мной классов, нужно, чтобы панель также раеагировала на эти события.

На С++ понятно как это делается, кто-то генерирует события (или я сам их генерирую c номерами User+1,User+2,...), а где-нибудь в IdleHandler я эти события обрабатываю.

На Java есть проблемы.

Поэтому я решил написать свой класс для прослушивания и обработки своих событий - наследник Thread с встроенным классом - двунаправленной структуры.
Конструктор класса создает первый узел, с сылками на самого себя,
метод add(MyComponent,char)  добавляет в двунапрвленный список сгенерированное кем-нибудь события (моим компонентом в данном случае) и ID события
а метод run() в непрерывном цикле смотрит очередь на предмет интересных ID

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

И, вот, не работает этот самый метод почему-то!!!

Может, кто-нибудь скажет в чем здесь проблема?

Код

import javax.swing.*;
import java.awt.*;
    class MyComponent extends JComponent
    { /* наш базовый компонент */
/* 1 */     boolean Press;
            MyEvent MyEv;
       public MyComponent(MyEvent myEv) /*передаем конструктору указатель на обработчик события*/
       {
            super();
            MyEv = myEv;
            setPreferredSize(new Dimension(200, 200)); /* выделяем объекту какое-то размер   */
            setBounds(10,10,120,120);                  /* и как-то располагаем его на экране */
/* 2 */     Press = false;
            addMouseMotionListener(new java.awt.event.MouseMotionAdapter() /* ОБРАБОТЧИК СОБЫТИЙ */
            {
              Point oldPosition;                                           /* старая точка */
              public void mouseMoved(java.awt.event.MouseEvent e)          /* обработчик события простого передвижения */
              {  
                oldPosition = e.getPoint();                                /* позиция курсора мыши до момента нажатия кнопки мыши */
              }
              public void mouseDragged(java.awt.event.MouseEvent e)
              {
                Component comp = e.getComponent();                         /* объект для извлечения координат владельца этого компонента */
                Point newPosition = e.getPoint();                          /* находим новые координаты курсора мыши */
                if(oldPosition != null)
                {
                  Point loc = comp.getLocation();                          /* извлекаем координады владельца объекта */
                  /* здесь решается вооброс о новой позиции объекта */
                  comp.setLocation(newPosition.x - (oldPosition.x - loc.x),newPosition.y - (oldPosition.y - loc.y));
                }
              }
             });
/* 3 обработчики событий нажатия и отпускания кнопки мыши*/
            addMouseListener(new java.awt.event.MouseAdapter() /* ОБРАБОТЧИК СОБЫТИЙ */
            {
              Point oldPosition;                                           /* старая точка */
              public void mousePressed(java.awt.event.MouseEvent e)          /* обработчик события простого передвижения */
              {  
                 System.out.println("The button have been pressed");
                 Press = true;
                 repaint();
                 MyEv.add(null,'P');
              }
              public void mouseReleased(java.awt.event.MouseEvent e)          /* обработчик события простого передвижения */
              {  
                 System.out.println("The button have been released");
                 Press = false;
                 repaint();
                 MyEv.add(null,'R');
              }
              public void mouseMoved(java.awt.event.MouseEvent e)          /* обработчик события простого передвижения */
              {  
                oldPosition = e.getPoint();                                /* позиция курсора мыши до момента нажатия кнопки мыши */
                MyEv.add(null,'M');
              }
              public void mouseDragged(java.awt.event.MouseEvent e)
              {
                Component comp = e.getComponent();                         /* объект для извлечения координат владельца этого компонента */
                Point newPosition = e.getPoint();                          /* находим новые координаты курсора мыши */
                if(oldPosition != null)
                {
                  Point loc = comp.getLocation();                          /* извлекаем координады владельца объекта */
                  /* здесь решается вооброс о новой позиции объекта */
                  comp.setLocation(newPosition.x - (oldPosition.x - loc.x),newPosition.y - (oldPosition.y - loc.y));
                 MyEv.add(null,'D');
                }
              }
            });
       }
       public void paintComponent(Graphics g)
       {  super.paintComponent(g);
/* 4 если кнопка мыши нажата, то квадрат зеленого цвета
     если отпущена, т о красного */
            if(Press) g.setColor(Color.green);
            else      g.setColor(Color.red);
          g.drawRect(10,10,100,100);
       }
    }
class MyEvent extends Thread /*Это обработчик моего события*/
{
      class arrange              /*внутри структура для двунаправленног списка*/
      {
            arrange next;       //указатель на последующий элемент
            arrange prev;       //указатель на предыдущий элемент
            MyComponent  MC;    // указатель на задачу, вызвавшую событие
            char         ID;    //идентификатор события
            public arrange(MyComponent MCo, char IDo)
            {
              MC = MCo;
              ID = IDo;
              next = this;
              prev = this;
            }
      }
      arrange chane;
      arrange chStart;
      arrange chCurrent;
      arrange chFORrun;
      public MyEvent()
      {  /* самый первый узел показывает сам на себя */
         chane = new arrange(null,'0');
         chane.next = chane;
         chane.prev = chane;
         chStart    = chane;
         chCurrent  = chane;
      }
      public synchronized void add(MyComponent MCo, char IDo)
      {  /* вставляем новый узел в конец очереди событий*/
         chane = new arrange(MCo, IDo);
         chane.prev        = chStart.prev;
         chane.next        = chStart;
         chStart.prev.next = chane;
         chStart.prev      = chane;
         System.out.println("Add!!!");
      }
      public void run()
      {  /* бесконечный цикл */
         while(true)
         {
           /* обход по очереди событий */
           chCurrent = chStart.next;
            while(chCurrent != chStart)
            {
              if(chCurrent.ID != '0')  /*если идентификатор не нуль, то обработаем его*/
              {
                System.out.println(" Обработал сообщение от   "+chCurrent.ID);
                /*надо бы еще удалить узел из очереди*/
              }
              chCurrent = chCurrent.next;
            }
         }
      }
}
public class Test 
    {
/* создаем задачу для обработки событий */
    MyEvent GenLis = null;
/* создаем все остальное */
    JPanel jPanel1;
    public static void main(String[] args) {
    new Test();
    /* < 1 <<<<<<<<<<<<<<<<<<<<< */
    
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
            try {                     
                  // UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");                    
                  UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");                    
                } catch ( Exception ex ) {} 
            } 
        });   
    /* > 1 >>>>>>>>>>>>>>>>>>>>> */
    }
    /* создаем (стартуем) задачу */
    public void start()
    {
        if(GenLis == null)
        {
           GenLis = new MyEvent();
           GenLis.start();
        }
    }
    /* останавливаем (уничтожаем) задачу */
    public void stop()
    {
        if(GenLis != null)
        {
           GenLis.interrupt();
           GenLis = null;
        }
    }
    public Test()
    {
        MyComponent myComponent = new MyComponent(GenLis);
        System.out.println(myComponent.getPreferredSize());
        jPanel1 = new JPanel();
        jPanel1.setLayout(null);
        jPanel1.add( myComponent);
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(jPanel1);
        frame.setSize(300, 300);
        frame.setVisible(true);
    }
}

PM MAIL WWW ICQ   Вверх
niasilil
Дата 14.5.2008, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



гы, отдыхать надо, срочно в отпуск smile
Код

174:        GenLis = new MyEvent();


Это сообщение отредактировал(а) niasilil - 14.5.2008, 06:28


--------------------
SCJP 5.0, SCJD
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.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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