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/クラス ActionListener が必須になることです。これと同等のコードを Jython で記述すると、これらを省略できるので、簡潔で見通しの良いコードを記述できます。addActionListener(newActionListener() { public void actionPerformed(ActionEvent e) { buttonActionPerformed(e); } }); private void buttonActionPerformed(ActionEvent e) { ... }Tips
》作業中です《Last updated♪09/04/21