Java/Python 導入ガイド:Event Properties

Java プログラマーのための Python 導入ガイド記事一覧
Event Properties

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

Java アプリケーションの実行中にコードを追加すると、その動作を変更できます。

 アプリケーションを起動した後で「この機能を加えたい」と気付いても後の祭りです。
 Jython なら、Java アプリケーションを実行したままで、後から機能を追加できます。
 今回は、アプリケーション実行中(一時停止せず)に、ボタンを押したときの操作を追加します。

対話モード

Jython の特徴は、アプリケーションを実行中に、そのプログラムを更新できることです。つまり、アプリケーションを終了しないで、コードを変更できるのです。それを確認するためのコードを次に示します。

from javax.swing import JFrame, JLabel, JButton
from java.awt import GridLayout
from random import randint

class RandomButton(JFrame):
    def __init__(self, title):
        self.defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        self.title = title
        self.button = JButton(text = "Next")
        self.label = JLabel(text = "0")
        self.contentPane.layout = GridLayout(1, 2)
        for e in self.button, self.label:
            self.add(e)

if __name__ == '__main__':
    frame = RandomButton("random")     # (@.@)
    frame.pack()
    frame.visible = True

大域変数 frame (@.@) を利用して、作成したウィンドウを参照できるようにします。これを実行すると、次のようなウィンドウが現れます。


ただし、ボタンを押しても何も反応しません。まだ(ボタンを押したときの動作を規定する)リスナーを追加していないからです。

$ jython -i exJButton.py 

オプション -i を指定すると、対話モードでモジュールの動作を確認できます。

>>> dir()
['GridLayout', 'JButton', 'JFrame', 'JLabel', 'RandomButton', '__doc__', '__file__', '__name__', 'frame', 
'randint']

組み込み関数 dir を利用すると、対話モードで参照できる名前の一覧が得られます。この中には(Java で定義された)既存のクラス JButton/JFrame/JLabel や(Jython で定義した)新規のクラス RandomButton の他に、大域変数 frame があります。そこで、この frame を介して、実行中のアプリケーションの機能(操作)を更新します。

更新:ボタン

    
>>> button javax.swing.JButton[,0,0,75x29,alignmentX=0.0,alignmentY=0.5,border=apple.laf.CUIAquaButtonBorder $Dynamic@66a551,flags=288,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=, disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=4,left=20,bottom=5,right=20], paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=, selectedIcon=,text=Next,defaultCapable=true]
プロパティー .button の値を参照すると(ウィンドウ内に配置した)ボタン JButton が得られます。
>>> def actionPerformed(e): frame.label.text = str(randint(0,100))
... 
    
ボタンを押したときの動作を規定する関数(リスナー)を用意します。ここでは(0 から 100 までの)乱数を生成して、それをラベルのテキスト(文字列)に設定します。
>>> button.actionPerformed = actionPerformed
>>> $ 
プロパティー .actionPerformed に関数 actionPerformed を設定すると、ボタンを押したときの機能(操作)を設定できます。 すると今度は、ボタンを押すたびに、乱数が表示されます。

何が問題か:リスナー

Java プログラマーなら、ActionListener を利用した次のコードの概要は理解できるでしょう。
public class RandomButton extends JFrame {
    public RandomButton() {
        ...
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                buttonActionPerformed(e);
            }
        });
    private void buttonActionPerformed(ActionEvent e) { ... }
大きな違いは、メソッド addActionListener/クラス ActionListener が必須になることです。これと同等のコードを Jython で記述すると、これらを省略できるので、簡潔で見通しの良いコードを記述できます。

Tips

》作業中です《
Last updated♪09/04/21