《Jython2.5》The Swing Tutorial, MenuDemoProject

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

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 MenuDemo.py 

事例:コードの解説

#! /usr/bin/jython2.5b3

## ----------------------------------------
from java.awt import BorderLayout
from java.awt.event import ActionEvent
from java.awt.event import ActionListener
from java.awt.event import ItemListener
from java.awt.event import KeyEvent
from javax.swing import ButtonGroup
from javax.swing import ImageIcon
from javax.swing import JCheckBoxMenuItem
from javax.swing import JFrame
from javax.swing import JMenu
from javax.swing import JMenuBar
from javax.swing import JMenuItem
from javax.swing import JPanel
from javax.swing import JRadioButtonMenuItem
from javax.swing import JScrollPane
from javax.swing import JTextArea
from javax.swing import KeyStroke

## ----------------------------------------
class MenuDemo(ActionListener, ItemListener):

    def createMenuBar(self):
        menuBar = JMenuBar()
        menu = JMenu("A Menu")
        menu.setMnemonic(KeyEvent.VK_A)
        menuBar.add(menu)

        self._JMenuItems(menu)
        menu.addSeparator()
        self._RadioButtonMenuItems(menu)
        menu.addSeparator()
        self._CheckBoxMenuItems(menu)
        menu.addSeparator()
        self._SubMenu(menu)
        self._SecondMenu(menuBar)
        return menuBar

様々なメニュー項目を設定します。

    def _JMenuItems(self, menu):
        accelerator = KeyStroke.getKeyStroke(
            KeyEvent.VK_1, ActionEvent.ALT_MASK)
        icon = MenuDemo.createImageIcon("images/middle.gif")

        for text, icon, key, accelerator in [
            ("A text-only menu item", None, KeyEvent.VK_T, accelerator),
            ("Both text and icon",    icon, KeyEvent.VK_B, None       ),
            ("",                      icon, KeyEvent.VK_D, None       ),
        ]:
            menuItem = JMenuItem(
                text = text,
                icon = icon,
                accelerator = accelerator,
                actionPerformed = self.actionPerformed,
                )
            menuItem.setMnemonic(key)
            menu.add(menuItem)

各メニュー項目 JMenuItem を設定します。

    def _RadioButtonMenuItems(self, menu):
        group = ButtonGroup()
        for text, selected, key in [
            ("A radio button menu item", True,  KeyEvent.VK_R),
            ("Another one",              False, KeyEvent.VK_O),
        ]:
            rbMenuItem = JRadioButtonMenuItem(
                text = text,
                selected = selected,
                actionPerformed = self.actionPerformed,
                )
            rbMenuItem.setMnemonic(key)
            group.add(rbMenuItem)
            menu.add(rbMenuItem)

各メニュー項目 JRadioButtonMenuItem を設定します。

    def _CheckBoxMenuItems(self, menu):
        for text, key in [
            ("A check box menu item", KeyEvent.VK_C),
            ("Another one",           KeyEvent.VK_H),
        ]:
            cbMenuItem = JCheckBoxMenuItem(
                text = text,
                actionPerformed = self.actionPerformed,
                )
            cbMenuItem.setMnemonic(key)
            menu.add(cbMenuItem)

各メニュー項目 JCheckBoxMenuItem を設定します。

    def _SubMenu(self, menu):
        submenu = JMenu("A submenu")
        submenu.setMnemonic(KeyEvent.VK_S)

        accelerator = KeyStroke.getKeyStroke(
            KeyEvent.VK_2, ActionEvent.ALT_MASK)

        for text, accelerator in [
            ("An item in the submenu", accelerator),
            ("Another item",           None),
        ]:
            menuItem = JMenu(
                text = text,
                accelerator = accelerator,
                actionPerformed = self.actionPerformed,
                )
            submenu.add(menuItem)
        menu.add(submenu)

各メニュー項目 JMenu には、サブメニュー JMenuItem を設定します。

    def _SecondMenu(self, menuBar):
        menu = JMenu("Another Menu")
        menu.setMnemonic(KeyEvent.VK_N)
        menuBar.add(menu)

    ## ----------------------------------------
    def createContentPane(self):
        contentPane = JPanel(
            layout = BorderLayout(),
            opaque = True,
            )
        self.output = JTextArea(
            columns = 5, rows = 30,
            editable = False,
            tabSize = 2,                        # (@.@) append
            )
        scrollPane = JScrollPane(self.output)
        contentPane.add(scrollPane, BorderLayout.CENTER)
        return contentPane
    
    ## ----------------------------------------
    def actionPerformed(self, e):
        source = e.source
        s = [
            "Action event detected.",
            "\tEvent source: %s (an instance of %s)"%(
                source.text, self.getClassName(source)),
            "",
        ]
        self.output.append("\n".join(s))
        self.output.caretPosition = self.output.document.length

    def getClassName(self, o):
        return o.__class__.__name__

    @staticmethod
    def createImageIcon(path):
        return ImageIcon(path)

## ----------------------------------------
def ex(*args):
    demo = MenuDemo()
    frame = JFrame(
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
        title = "MenuDemo",
        JMenuBar = demo.createMenuBar(),
        contentPane = demo.createContentPane(),
        )
    frame.size = 450, 260
    frame.visible = True

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

Tips

》作業中です《

Last updated♪09/05/27