Вопрос задал
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); } }
|