0

この質問の提案に基づいてイベントシステムを使用しています: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() {

       }
   });
4

1 に答える 1

0

オブザーバーパターンに関するこのウィキペディアのエントリに基づいて、イベントシステムを機能させました!私が思ったように、Javaにはこの種のもののためのいくつかの事前定義されたシステムがあります。

于 2012-12-09T20:56:56.080 に答える