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

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

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

《著》越智ことり+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 step10/TreeEx.py

  

》作業中です《

事例:コードの解説

■ モジュール:TreeView.py
#! /usr/bin/jython2.5b3
...
from java.awt import GridLayout
from javax.swing import JButton

from TreeComposite import Node

## ----------------------------------------
class View(JPanel):
    def __init__(self, **keys):
        ...
        for e, constraints in [
            (self.init_splitPane(), BorderLayout.CENTER),
            (self.init_buttons()  , BorderLayout.SOUTH ),
        ]:
            self.add(e, constraints)

    def init_splitPane(self):
        global                              Xview; Xview = \
        self.tree = JTree(
            valueChanged = self.valueChanged,
            )
        tree = JScrollPane(self.tree)

        self.textArea = JTextArea(
            font = Font("Courier", Font.PLAIN, 12),
            )
        textArea = JScrollPane(self.textArea)

        pane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT)
        pane.leftComponent  = tree
        pane.rightComponent = textArea
        return pane

    def init_buttons(self):
        button = JButton(
            label = "Tree",
            actionPerformed = self.actionPerformed,
            )
        panel = JPanel(GridLayout(1, 0))
        panel.add(button)
        return panel

ボタン JButton を選択するとイベントが発生して、リスナー actionPerformed を起動します。

    def valueChanged(self, e):
        node = e.path.lastPathComponent
        self.textArea.text = str(Node(node))

    def actionPerformed(self, e):
        window = PopWindow(
            title = str(self.tree.selectionPath.lastPathComponent),
            )
        window.open()

選択したノード getLastPathComponent を、ウィンドウのタイトルに表示します。

class PopWindow(JFrame):
    def __init__(self, **keys):
        super(self.__class__,self).__init__(
            defaultCloseOperation = JFrame.DISPOSE_ON_CLOSE,
            **keys)

    def open(self, x=900, y=200, w=200, h=150):
        self.bounds = x, y, w, h
        self.visible = True

新たに導入したクラス PopWindow は、部分ツリーを表示するためのものです。

Tips

》作業中です《

Last updated♪09/06/11