Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Собственное событие
Форум программистов > Системное программирование > Java
Tinki
Народ! Как мне подписаться на событие paint для Frame?
Я из thread раз в секунду вызываю repaint(). Надо написать custom event, который бы резво на такое событие реагировал.
Я целый день бьюсь и ничего не выходит.
Можно мне рабочий сырец?
Хоть что-нибудь дайте, а то моск уже булькает. sad.gif
Tinki
Замутил вот таку строчку. Програ работает и резво откликается на позыва потока.
Хотя я убей не пойму, чем такой хитровыдуманный код отличается(и превосходит) явный вызов метода. Но уж условие такое, сделать собственное событие. dry.gif
К чему строчу... Как бы мне в MyListener (в конце кода) из переменной dde вычленить Dot? который закладывается через this.fireDotDrawn(350). Когда выезжает список-подсказка после "dde.",в нем по-моему только 8 строк касательно event, но ничего про мои встроенные переменные. dry.gif

Код
    class Painter extends Thread{
        private Vector listeners = new Vector();
        private int w=-1;
        public void run(){
            if (w==-1){
                w=i;
            }
            while (true){
                System.out.println(w);
                xCr[w]=(rnd.nextInt(300));
                yCr[w]=(rnd.nextInt(300));
                System.out.println(xCr[w]+" "+ yCr[w]);
                this.fireDotDrawn(350);
                repaint();
                try {
                    sleep(1000);
                } catch(InterruptedException e) {}
            }
        }
        public synchronized void addDotDrawnListener(DotDrawnListener ddl) {
            listeners.addElement(ddl);
        }
        public synchronized void removeDotDrawnListener(DotDrawnListener ddl) {        
            listeners.removeElement(ddl);
        }
        protected void fireDotDrawn(int Dot) {
            Vector l;
            DotDrawnEvent dde = new DotDrawnEvent(this, Dot);
            synchronized (this) {
                l = (Vector) listeners.clone();}
            
            // Оповестим подписчиков о наступлении события
            
            for (int i = 0; i < l.size(); i++) {
                ((DotDrawnListener)l.elementAt(i)).DotDrawn(dde);
            }
        }
    }
    
    class Butreac  implements ActionListener{
        public void actionPerformed(ActionEvent ae) {
            i++;
            yCr = new int[i+1];
            xCr = new int[i+1];
            thDot = new Painter[i+1];
            thDot[i] = new Painter();
            thDot[i].addDotDrawnListener(mylis);
            thDot[i].start();
            
        }
        
    }
    
    interface DotDrawnListener extends java.util.EventListener {
        void DotDrawn(DotDrawnEvent dde);
    }
    
    public class DotDrawnEvent extends java.util.EventObject {
        
        protected transient int DotCode;
        
        DotDrawnEvent(java.lang.Object source, int Dot) {
            super(source);
            DotCode = Dot;
        }
        
        public int getDotDrawn() {
            return DotCode;
        }
    }
    
    
    
    public class MyListener implements DotDrawnListener {
        public void DotDrawn(DotDrawnEvent dde) {
            //Вот тут хочу писать dde.Dot, но такого варианта нет в списке.
            System.out.println("Good!");
        }
        
    }
Azrael
Для: Tinki
Ээээ, а неужто dde.getDotDrawn() не работает?

У Вас в Painter.run() вызывается this.fireDotDrawn(350); (protected void fireDotDrawn(int Dot) ), в нем DotDrawnEvent dde = new DotDrawnEvent(this, Dot);
А в конструкторе DotDrawnEvent прописано
Код
DotDrawnEvent(java.lang.Object source, int Dot) {
            super(source);
            DotCode = Dot;
        }
при этом в самом классе нет DotDrawnEvent.Dot.

P.S.
Цитата
Хотя я убей не пойму, чем такой хитровыдуманный код отличается(и превосходит) явный вызов метода. Но уж условие такое, сделать собственное событие.


Класс Painter в Вашей разработке может в дальнейшем перестать быть внутренним по отношению к Frame, соответственно, вызвать repaint напрямую не получится
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.