イベントリスナーを登録する

ボタンを選択したときに発生するイベントに反応するには、リスナーを設定しておきます。それには、次のように、

    public void addActionListener(ActionListener l)

メソッド addActionListener を利用します。引数 l には、インターフェース ActionListener を実現した、任意のリスナーオブジェクトを指定できます。リスナーには、次のメソッドを実現しておく必要があります。


    void actionPerformed(ActionEvent e)

メソッド actionPerformed(ActionEvent) は(Swing が提供するフレームワークに沿って)イベント ActionEvent が発生したときに呼び出されます。「ハリウッドの原則」に従って、このメソッドを呼び出すコードを記述する必要はありません。そして、メソッドを定義するときには、発生したイベント e から、必要な情報を獲得できます。

    view = new JButton();
view.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
...

JavaBeans に準拠した Swing には、Jython の便利な機能を適用できます。すると、ここに示した Java 版のコードと同じ効果を得るのは簡単で、次のように、

    view = JButton( 
actionPerformed=now,

キーワード引数 actionPerformed= の後に、イベントリスナー(関数/メソッド)を指定するだけです。すると、特定のクラス(実現方法)には依存せず「インターフェースの規定だけに従う」ことが、より明確になります。


このようにすると、キーワード actionPerformed= を固定するだけで、仕様変更にも柔軟に対処できるコードが得られます。Java の国境を越えて Jython の世界に入るときには、addActionListener/ActionListener など余分な荷物は捨てて、身軽な旅を堪能できます。この特徴は、他のコンポーネントにも利用できるので、重宝します。

ウィンドウを開いてパネルを表示する

ここまでは、同じウィンドウ内に情報を表示してきました。今回は、ユニフォームを表示するために、新たなパネル/ウィンドウが必要になるので、工夫が必要です。
【例題2】JButton を選択したときの日時を、新たなウィンドウに表示したい。


ボタンを選択すると、新たなウィンドウが現われて、そこに日時が表示されます。これを実現したのが、次のコードです。

class ClockPanel(JPanel):
def __init__(self, now):
self.add(JLabel(
text=`now`,
icon=ImageIcon("icons/clock.gif"),
))
def show(self):
frame = JFrame(
title="What time is it now?",
)
frame.add(self)
frame.pack()
frame.show()

def ex_JButton_actionPerformed2():
def now(e): ClockPanel(Date()).show()
... No change ...

このクラスでは、例題1における標準出力に代わって、現在の日時を表示するためのパネルを提供します。


Previous|3/5|Next