Event Style アーキテクチャについて読んでいて、これに出くわしました
通知を配信するにはさまざまな方法がありますが、最も一般的な手法は、実行時に初期化されるポインターを介して行われる間接的なメソッド呼び出しを使用します。
しかし、Java にポインターがない場合、どのように通知を配信するのでしょうか?
Event Style アーキテクチャについて読んでいて、これに出くわしました
通知を配信するにはさまざまな方法がありますが、最も一般的な手法は、実行時に初期化されるポインターを介して行われる間接的なメソッド呼び出しを使用します。
しかし、Java にポインターがない場合、どのように通知を配信するのでしょうか?
Java Swing はリスナーを使用して、イベントに関する通知を配信します。
これは、Swing クラスのコード スニペットです。
Font font = model.getActivityFont();
activityTextFontButton = new JButton(getFontText(font));
activityTextFontButton.setFont(font);
activityTextFontButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
JFontChooser fontChooser = new JFontChooser();
fontChooser.setSelectedFont(model.getActivityFont());
int result = fontChooser.showDialog(dialog);
if (result == JFontChooser.OK_OPTION) {
Font font = fontChooser.getSelectedFont();
String text = getFontText(font);
model.setActivityFont(font);
activityTextFontButton.setText(text);
activityTextFontButton.setFont(font);
JButton dummy = new JButton(text);
setButtonSizes(activityTextFontButton,
connectorTextFontButton, dummy);
dialog.validate();
dialog.pack();
}
}
});
ボタンが押されると、JButton クラスは ActionListener の一部であるコードを実行します。これは、JButton クラスが ActionListener インスタンスへの参照を持ち、実行するメソッドが actionPerformed であることを認識しているためです。
Java でイベントを駆動する方法は他にもありますが (Observer / Observed クラスを参照)、リスナーはイベントに関する通知を配信する非常に優れた方法です。
Java のイベント システムはオブザーバーパターンに基づいていますが、Java Swing ではすべてが「オブザーバー」ではなく「リスナー」と呼ばれ、通常は実装さEventListener
れます (そのリンクの上部にあるビーストからわかるように)。
たとえば、 などのコンポーネントをJButton
使用すると、ボタンで何かが発生するタイミングを気にするリスナーを追加できます。リスナーがボタンのクリックを気にする場合はActionListener
、ボタンに をJButton
追加し、後で使用するために内部リストに追加します (具体的には を使用しますEventListenerList
)。ユーザーがボタンをクリックすると、JButton
クラスはActionListener
登録されているすべての実装に対してイベントを「起動」します。
これは基本的にオブザーバー パターンです。これは、観察されているサブジェクト ( JButton
) と、サブジェクトの変更またはイベントについて通知を受けたいオブザーバー( ) があるためActionListener
です。
Java 自体にはポインターがありませんが、これが実現できないわけではありません。C++ では、サブジェクトに関数ポインターを渡し、サブジェクトはその関数を呼び出すだけです。Java には関数ポインターがないため、特定のインターフェイスを実装するオブジェクトをサブジェクトに渡すと、サブジェクトはインターフェイスの正確なメソッドを呼び出します。上記の例では、これがActionListener.actionPerformed(ActionEvent)
メソッドになります。
このメソッドは、関数ポインタなどのメカニズムがなく、Java インターフェイスが普及しているため、Swing 以外の Java ライブラリでも人気があることに注意してください。