Java.use(better,Python)《3》ボタンを配置する
|記事一覧|《こちらに移動中です》2006年9月 6日 (水)
Java.use(better, Python) # Jython はじめました
《3》ボタンを配置する 《Jython2.5.0》
■ 概要
プログラマーにとっての「地デジ」対応は進んでいますか? ここでは、アナログ世代(Java/C#)からディジタル世代(Ruby/Python)への脱皮を目指して、「真のアジャイル対応」への準備を怠りない、プログラマーのみなさんを支援する話題を提供します。Java/C# が抱える深刻な問題は「対岸の火事」とばかりも言っていられません。Java/C# の常識は、オブジェクト指向の非常識。さあ、ご一緒に「真のオブジェクト指向」の世界へと続く扉を開いてみませんか。
■ 関連記事
ボタンを配置する
■ ボタン:ラベルを表示する
まず、ボタンをひとつ追加します。
from javax.swing import * def ex01(): f = JFrame( defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (150,100), title = 'Happy', ) b = JButton('Are you happy?') f.add(b) f.visible = True
引数に指定した文字列 'Are you happy?' をラベルとする、ボタン JButton を生成して、これをフレーム内に配置します。フレーム内に部品を配置するときには、add() を利用します。このとき、Java と同様に、メソッド呼び出しの構文が使えます。
■ ボタン:画像を表示する
次に、文字列だけではなく、ボタンにアイコン画像を表示します。
def ex02(): f = JFrame( defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (150,100), title = 'Happy', ) b = JButton( icon = ImageIcon("image/earth.gif"), text = 'Are you happy?', ) f.add(b) f.visible = True
キーワード引数 icon= には、指定したファイル "image/earth.gif" から読み込んだ、アイコン画像 ImageIcon を設定します。キーワード引数 text= には、ボタンのラベルを設定します。
■ ボタン:動作を規定する
さらに、ボタンをクリックしたときに、メッセージを出力するようにします。
from time import ctime def ex03(): f = JFrame( defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (150,100), title = 'Happy', ) b = JButton( icon = ImageIcon("image/earth.gif"), text = 'Are you happy?', actionPerformed = action, ) f.add(b) f.visible = True def action(e): print ctime()
actionPerformed= には、ボタンをクリックしたときの動作を規定した、関数 action を設定します。API 仕様 には、次のように記述されています。
void actionPerformed(ActionEvent e)
インターフェース ItemListener で規定されたメソッド actionPerformed は、ActionEvent 型の引数 e を1つ必要とするのが分かります。そこで、この仕様に準拠する関数 action を定義します。def の後に続けて、この関数のヘッダーを記述します。関数の本体では、print 文を使って、端末にメッセージを出力します。関数の本体を記述するときには、インデントを使って他の行と区別をします。
Python では、インデントは文法を構成する重要な要素です。関数のヘッダーの後にコロン「:」を続けて、そこから関数の本体を記述します。本体が複数行からなるときには、インデントを使って範囲を明確にします。コードを記述するときには、文章を記述するときと同様に、ブロックの範囲を表わす {} や begin...end などは不要です。ワードプロセッサーやアウトラインエディターのように、パラグラフやインデントを使って、ひとまとまりの意味を伝えます。
何が問題か
ところが、このコードを実行すると、次のようなエラーメッセージが表示されます。
Traceback (most recent call last): ... b = JButton( NameError: global name 'action' is not defined
ここで、NameError とあるのは、メソッド action を認識できないからです。Jython では、記述したコードをそのままの順序で評価します。そのため、キーワード引数 actionPerformed=something_to_do を評価するときに、未定義のメソッドの名前を認識できません。そこで、メソッドを定義するコードの断片を、キーワード引数を評価する前に記述するようにします。
from time import ctime def action(e): print ctime() def ex03(): f = JFrame( defaultCloseOperation = JFrame.EXIT_ON_CLOSE, size = (150,100), title = 'Happy', ) b = JButton( icon = ImageIcon("image/earth.gif"), text = 'Are you happy?', actionPerformed = action, ) f.add(b) f.visible = True
すると、コードは無事にコンパイルされ、実行されます。ボタンをクリックすると、端末にメッセージが出力されます。