この質問の提案に基づいてイベントシステムを使用しています:Javaでカスタムイベントを作成する
コンポーネントのボタンからイベントを処理してパススルーするために、コンポーネントに実装しました。コンポーネントを独自のjarファイルに入れました。次に、別のプロジェクトでコンポーネントとjarファイルを使用し、それを使用して作成したプログラムを実行しようとすると、次のエラーが発生しました。
java.lang.IllegalAccessException:クラスEventing.EventHandlerは、修飾子「public」を使用してクラスoutfit.proto.frmDo$1のメンバーにアクセスできません。
これは私が書いたEventHandlerクラスのコードです:
public class EventHandler<T> {
private ArrayList<T> listenerPool = new ArrayList<>();
public void addListener(T listener){
listenerPool.add(listener);
}
public void raiseEvent(Object eventData){
for (T listener : listenerPool){
try {
if (eventData != null) {
listener.getClass().getDeclaredMethods()[0].invoke(listener, eventData);
} else {
listener.getClass().getDeclaredMethods()[0].invoke(listener);
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(EventHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
これは、コンポーネントでEventHandlerクラスを設定する方法です。
EventHandler<EventListener> _loginEvent = new EventHandler<>();
public EventHandler<EventListener> loginEvent(){
return _loginEvent;
}
loginButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
_loginEvent.raiseEvent(null);
}
});
これは私がfrmDoのイベントをキャッチするためにしたことです:
this.component2.loginEvent().addListener(new EventAdapter() {
@Override
public void executeResult() {
}
});