Java.use(better,Python)《3》ボタンを配置する

記事一覧《こちらに移動中です》2006年9月 6日 (水)

Java.use(better, Python) # Jython はじめました

《3》ボタンを配置する 《Jython2.5.0》

《著》伊藤うさぎ・小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23

■ 概要

プログラマーにとっての「地デジ」対応は進んでいますか? ここでは、アナログ世代(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

すると、コードは無事にコンパイルされ、実行されます。ボタンをクリックすると、端末にメッセージが出力されます。

Last updated♪2009/08/10