Да, это довольно прямо, как только кто-то показывает вам, как создать ваших собственных слушателей.
Во-первых, вы создаете свой собственный EventObject. Вот пример из одного из моих проектов.
import gov.bop.rabid.datahandler.bean.InmateDataBean;
import java.util.EventObject;
public class InmatePhotoEventObject extends EventObject {
private static final long serialVersionUID = 1L;
protected InmateDataBean inmate;
public InmatePhotoEventObject(Object source) {
super(source);
}
public InmateDataBean getInmate() {
return inmate;
}
public void setInmate(InmateDataBean inmate) {
this.inmate = inmate;
}
}
Нет ничего специального об этом классе, кроме него расширяет EventObject. Ваш конструктор определяется EventObject, но можно создать любые методы, которые вы хотите.
Во-вторых, вы определяете интерфейс EventListener.
public interface EventListener {
public void handleEvent(InmatePhotoEventObject eo);
}
Вы использовали бы EventObject, который вы создали. Можно использовать любое имя метода или имена, которые вы хотите. Это - интерфейс для кода, который будет написан как ответ слушателю.
В-третьих, вы пишете ListenerHandler. Здесь мое из того же самого проекта.
import gov.bop.rabid.datahandler.bean.InmateDataBean;
import gov.bop.rabid.datahandler.main.EventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventListener;
import gov.bop.rabid.datahandler.main.InmatePhotoEventObject;
import java.util.ArrayList;
import java.util.List;
public class InmatePhotoListenerHandler {
protected List listeners;
public InmatePhotoListenerHandler() {
listeners = new ArrayList();
}
public void addListener(EventListener listener) {
listeners.add(listener);
}
public void removeListener(EventListener listener) {
for (int i = listeners.size() - 1; i >= 0; i--) {
EventListener instance = listeners.get(i);
if (instance.equals(listener)) {
listeners.remove(i);
}
}
}
public void fireEvent(final InmatePhotoEventObject eo,
final InmateDataBean inmate) {
for (int i = 0; i < listeners.size(); i++) {
final EventListener instance = listeners.get(i);
Runnable runnable = new Runnable() {
public void run() {
eo.setInmate(inmate);
instance.handleEvent(eo);
}
};
new Thread(runnable).start();
}
}
public static void main(String[] args) {
System.out.println("This line goes in your DataHandlerMain class "
+ "constructor.");
InmatePhotoListenerHandler handler = new InmatePhotoListenerHandler();
System.out.println("I need you to put the commented method in "
+ "DataHandlerMain so I can use the handler instance.");
//public InmatePhotoListenerHandler getInmatePhotoListenerHandler() {
// return handler;
//}
System.out.println("This line goes in the GUI code.");
handler.addListener(new InmatePhotoEventListener());
System.out.println("Later, when you've received the response from "
+ "the web service...");
InmateDataBean inmate = new InmateDataBean();
inmate.setIntKey(23);
handler.fireEvent(new InmatePhotoEventObject(handler), inmate);
}
}
Основной метод в этом классе показывает вам, как вы используете ListenerHandler. Остальная часть методов в классе стандартная. Вы использовали бы свой собственный EventObject и EventListener.