Собственное событие

  • Автор темы Tinki
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

Tinki

Народ! Как мне подписаться на событие paint для Frame?
Я из thread раз в секунду вызываю repaint(). Надо написать custom event, который бы резво на такое событие реагировал.
Я целый день бьюсь и ничего не выходит.
Можно мне рабочий сырец?
Хоть что-нибудь дайте, а то моск уже булькает. :)
 
T

Tinki

Замутил вот таку строчку. Програ работает и резво откликается на позыва потока.
Хотя я убей не пойму, чем такой хитровыдуманный код отличается(и превосходит) явный вызов метода. Но уж условие такое, сделать собственное событие. <_<
К чему строчу... Как бы мне в MyListener (в конце кода) из переменной dde вычленить Dot? который закладывается через this.fireDotDrawn(350). Когда выезжает список-подсказка после "dde.",в нем по-моему только 8 строк касательно event, но ничего про мои встроенные переменные. <_<

Код:
	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!");
}

}
 
A

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 напрямую не получится
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!