《Jython2.5》The Swing Tutorial, ListDemoProject

The Swing Tutorial - Jython記事一覧
《事例》ListDemoProject

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

■ 概要

公式サイト《The Swing Tutorial》で公開されている例題を、Jython で再構成したものを公開します。

 ここでは、スタッフの研修用に作成した例題(サンプル集)を公開します。
 原則として、オリジナル版の趣旨を尊重しつつ、Jython の特徴を活かすように改編しています。
 なお、プログラムの不具合については「小粒ちゃん」にお問い合わせください。

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

事例:モジュールの起動

$ jython2.5b3 -i ListDemo.py 

事例:コードの解説

#! /usr/bin/jython2.5b3

## ----------------------------------------
from java.awt import BorderLayout
from java.awt import Toolkit
from java.awt.event import ActionListener
from javax.swing import BorderFactory
from javax.swing import Box
from javax.swing import BoxLayout
from javax.swing import DefaultListModel
from javax.swing import JButton
from javax.swing import JFrame
from javax.swing import JList
from javax.swing import JPanel
from javax.swing import JScrollPane
from javax.swing import JSeparator
from javax.swing import JTextField
from javax.swing import ListSelectionModel
from javax.swing import SwingConstants
from javax.swing.event import DocumentListener
from javax.swing.event import ListSelectionListener

## ----------------------------------------
class ListDemo(JPanel, ListSelectionListener):

    def __init__(self, *args, **keys):
        super(self.__class__,self).__init__(
            layout = BorderLayout(),
            **keys)

与えられた引数 keys は、そのまま JPanel に適用されます。

        hireString = "Hire"
        fireString = "Fire"

        self.listModel = DefaultListModel()
        for e in [
            "Debbie Scott",
            "Scott Hommel",
            "Sharon Zakhour",
        ]:
            self.listModel.addElement(e)

        self.list = JList(
            model = self.listModel,
            selectionMode = ListSelectionModel.SINGLE_SELECTION,
            selectedIndex = 0,
            visibleRowCount = 5,
            valueChanged = self.valueChanged,
            )
        listScrollPane = JScrollPane(self.list)

リスナーとして、メソッドオブジェクト self.valueChanged を指定します。

        hireButton = JButton(
            label = hireString,
            actionCommand = hireString,
            enabled = False,
            )
        hireListener = HireListener(hireButton, self)
        hireListener._client = self
        hireButton.actionPerformed = hireListener.actionPerformed

        def FireListener(e):
            index = self.list.selectedIndex
            self.listModel.remove(index)
            size = self.listModel.getSize()
            if not size:
                self.fireButton.enabled = False
            else:
                if index == self.listModel.getSize():
                    index -= 1
                self.list.selectedIndex = index
                self.list.ensureIndexIsVisible(index)

        self.fireButton = JButton(
            label = fireString,
            actionCommand = fireString,
            actionPerformed = FireListener,
            )

リスナーとして、関数オブジェクト FireListener を指定します。

        self.employeeName = JTextField(10,
            actionPerformed = hireListener,
            )
        self.employeeName.document.addDocumentListener(hireListener)

リスナーとして、インスタンスオブジェクト hireListener を指定します。

        buttonPane = JPanel(
            border = BorderFactory.createEmptyBorder(5,5,5,5),
            )
        buttonPane.layout = BoxLayout(buttonPane, BoxLayout.LINE_AXIS)
        for e in [
            self.fireButton,
            Box.createHorizontalStrut(5),
            JSeparator(SwingConstants.VERTICAL),
            Box.createHorizontalStrut(5),
            self.employeeName,
            hireButton,
        ]:
            buttonPane.add(e)

        for e, constraints in [
            (listScrollPane, BorderLayout.CENTER  ),
            (buttonPane,     BorderLayout.PAGE_END),
        ]:
            self.add(e, constraints)

    def valueChanged(self, e):
        if not e.valueIsAdjusting:
            if self.list.selectedIndex == -1:
                self.fireButton.enabled = False
            else:
                self.fireButton.enabled = True

## ----------------------------------------
class HireListener(ActionListener, DocumentListener):
    alreadyEnabled = False

    def __init__(self, button, client):
        self.button = button
        self._client = client

    def actionPerformed(self, e):
        name = self._client.employeeName.text

        if name=="" or self._alreadyInList(name):
            Toolkit.getDefaultToolkit().beep()
            self._client.employeeName.requestFocusInWindow()
            self._client.employeeName.selectAll()
            return

        index = self._client.list.selectedIndex
        if index == -1:
            index = 0
        else:
            index += 1

        self._client.listModel.insertElementAt(
            self._client.employeeName.text, index)
        
        self._client.employeeName.requestFocusInWindow()
        self._client.employeeName.setText("")

        self._client.list.setSelectedIndex(index)
        self._client.list.ensureIndexIsVisible(index)

    def _alreadyInList(self, name):
        return self._client.listModel.contains(name)

    def insertUpdate(self, e):
        self._enableButton()

    def removeUpdate(self, e):
        self._handleEmptyTextField(e)

    def changedUpdate(self, e):
        if not self._handleEmptyTextField(e):
            self._enableButton()

    ## ----------------------------------------
    def _enableButton(self):
        if not self.alreadyEnabled:
            self.button.enabled = True

    def _handleEmptyTextField(self, e):
        if e.document.length <= 0:
            self.button.enabled = False
            self.alreadyEnabled = False
            return True
        return False

## ----------------------------------------
def ex(*args):
    frame = JFrame(
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
        title = "ListDemo",
        contentPane = ListDemo(opaque = True),
        )
    frame.pack()
    frame.visible = True

## ----------------------------------------
if __name__ == '__main__':
    ex()

Tips

》作業中です《

Last updated♪09/05/27