《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 で再構成しました。
■ 関連記事
事例:コードの解説
#! /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