例題で学ぶデザインパターン #2: JTextArea を利用する

前の記事記事一覧次の記事

例題で学ぶ Jython/Swing デザインパターン《Jython2.5》
JTextArea を利用する

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

■ 概要

例題により、アプリケーションを作成する過程を通して、Jython/Swing によるデザインパターンを習得します。

この課題では、Swing/GUI を使って階層構造を持つ情報を提示します。〈GoF〉Composite/Iterator/Visitor/Command パターンを導入すると、if/for 文によるコードの汚染、配列の境界問題が解消されるので、要求仕様の変更にも柔軟に対処でき、簡潔で見通しの良いコードを記述できるようになります。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

事例:モジュールを起動する

モジュールを起動すると、次のようなウィンドウが現れます。

$ jython2.5b3 -i step02/TreeEx.py 

 

ツリー JTree を構成する各ノードを選択すると、その項目の名前がテキスト領域 JTextArea に表示されます。たとえば、ノード violet を選択すると、テキスト領域に文字列 violet が表示されます。

事例:Java の世界を Jython から観察する

実行中の Java アプリケーションの状態を、Jython の対話モードで確認できるので便利です。

>>> view = Xview
>>> type(view)

    
>>> type(node) >>> node violet
大域変数 Xview を介して、JTree を参照できます。すると、選択した子ノード node は、violet だと分かります。
《Note》path により、選択したノードのパス要素が得られます。さらに、lastPathComponent により、パスの末尾にあるコンポーネント(ノード DefaultMutableTreeNode)が得られます。

事例:コードの解説

■ モジュール:TreeEx.py
...
from javax.swing import JSplitPane
from javax.swing import JTextArea

class View(JPanel):
    def __init__(self, **keys):
        super(self.__class__,self).__init__(
            layout = BorderLayout(),
            )
        global                              Xview; Xview = \
        self.tree = JTree(
            valueChanged = self.valueChanged,
            )
JTree のノードを選択すると(値が変更されたときに)メソッド valueChanged が呼び出されます。
        tree = JScrollPane(self.tree)
        self.textArea = JTextArea()
        textArea = JScrollPane(self.textArea)

        pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT)
        pane.leftComponent  = tree
        pane.rightComponent = textArea
        self.add(
            pane, BorderLayout.CENTER,
            )
    def valueChanged(self, e):
        node = e.path.lastPathComponent
        self.textArea.text = str(node)
ノードを選択した(値が変更された)ときに発生するイベント e から、選択した項目 node が得られます。
class Window(JFrame):
    def __init__(self, title, **keys):
        super(self.__class__,self).__init__(
            title = title,
            contentPane = View(),
            defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
            )

## ----------------------------------------
def ex(*args):
    window = Window(title = "Step 02:")
    window.open(800, 100, 250, 200)

Tips

》作業中です《
Last updated♪09/06/18