Java.use(better,Python)《6.5》モジュール:jarray

《こちらに移動中です》

2008年4月25日 (金)
記事一覧
Java.use(better, Python) # Jython 導入ガイド

------------ 序 ------------

ここで公開している記事は「キーワード検索」を利用するための便宜的なものです。詳細は、正式版(査読中)をダウンロードしてご覧ください。

【目次】関連記事
Python/Jython/Swing 入門〕Shall_we_Agile = Java.use(better, Python) # Swing
実際のアプリケーション開発を疑似体験できるように、問題解決に至るまでの紆余曲折を示しながら「繰り返し段階的に」技術を習得するための話題を提 供します。OOP〔Object-Oriented Programming〕を体得するには、五感を通してフィードバックが得られる論理的シミュレーションによって、現実世界を疑似体験するのが効果的で す。この連載で、Java の常識が壊れるかもしれませんが、OOP の可能性は広がります。

【注意】連載の主旨から「先に示したプログラムが後で覆される」事例が含まれます。次の展開(失敗から何を学ぶか/学ばないか)を予想しながら読み進むのも一興です。

------------ 本文 ------------

気軽に Swing〔6〕TransferHandler: DnD

Java.use(better,Swing=Jython) 〜 萬プログラマーのための Python 導入ガイド
本間りす、森こねこ〔著〕 小泉ひよ子とタマゴ倶楽部〔監修〕

■ モジュール:jarray

 モジュール jarray は、Java の配列を扱うための便利な機能を提供します。

 たとえば、jarray.zeros(0,'i') は、int 型の要素を扱う配列を生成しますが、Jython の世界では、これを組み込み型 list などと同様に扱えます。

class InspectorPanel(JPanel):
    import jarray
    species = jarray.zeros(0, 'i').__class__
    def __init__(self, target, selection=None):
        self.target = target
        if not selection:
            selection = SelectionPanel
        ... No change ...
    def actionPerformed(self, e):
        e = self.listView.selectedValue
        e = getattr(self.target, e)    # oops (x.x)
        import jarray
        s = (SelectionPanel, SelectionPanel_array)[
            isinstance(e, self.species)]
        Inspector(e, s).show()

 改訂したクラス InspectorPanel では、リスト項目から選択した対象が配列なら、SelectionPanel_array を組み込んだ専用のインスペクターを起動します。改訂したコンストラクターでは、引数 selection を省略すると、規定値 SelectionPanel を設定して、汎用のインスペクターを起動します。

class SelectionPanel_array(JPanel):
    def __init__(self, client, target):
        self.client = client
        self.target = target
        self.layout = BorderLayout()
        e = self.listView = JList(
            listData=range(len(self.target)), 
            valueChanged=self.valueChanged,
            preferredSize=(50, 100), 
            )
        self.add(JScrollPane(e), BorderLayout.CENTER)
    def valueChanged(self, e):
        s = self.selectedValue = e.source.selectedValue
        s = self.target[s]
        self.client.valueUpdate(s)

 新たなクラス SelectionPanel_array は、配列を対象とする専用のパネルを提供します。リスト項目には、配列の添字が提示されます。そのため、各要素を参照するには、添字演算子を利用して self.target[s] とします。

■ 例外:TypeError

 しかし、半歩前進したインスペクターには、問題があります。リスト項目から配列の添字を選択したまま、ボタン 'inspect' を選択すると、 例外 TypeError が発生して、次のエラーメッセージが出力されます。

TypeError: getattr(): 2nd arg can't be coerced to String

これは、組み込み関数 getattr が「第2引数に文字列」を期待しているのに、互換性のない引数が渡されたことを意味します。これを回避する方法は、次回に紹介します。

《バグの正しい飼い方》TypeError が発生したら、引数に互換性があるか、確認してみることです。

終わりに

 ドラッグ&ドロップは、コンポーネント潜在的な能力を引き出して、新たな機能を付加する仕組みを提供できるのが分かりました。次回は、JFrame に着目します。□

Last updated♪2009/07/27