~/home_Jython/berry_py/worldCup/ex01/wc01_JList.py

INDEX Java.use(better, Jython)

》作業中です《

#! /usr/bin/env python
# coding: utf-8
## ----------------------------------------
##
## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
##
## ----------------------------------------
## History: Swing Example "2010 FIFA World Cup South Africa"
##      2003/07, Java/Jython
##      2006/07, Jython
##      2008/02, Jython 2.2.1
##      2010/06, Jython 2.5.0
#...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
"""
>>> tips()

>>> ## ----------------------------------------
>>> None
version: #1.0.29
"""
from __init__ import *

## ----------------------------------------
## 気軽に Swing〔1〕JList: 予選リーグ全32チーム
## Java.use(better,Swing=Jython) 〜 萬プログラマーのための Python 導入ガイド
## ----------------------------------------
## ----------------------------------------
## 2008/03/10《1.1》今回の課題:全32チームの旗を掲げよう
## ----------------------------------------
from os.path import exists

from java.awt import Font
from javax.swing import ImageIcon
from javax.swing import JFrame
from javax.swing import JLabel
from javax.swing import JList
from javax.swing import JPanel
from javax.swing import JScrollPane
from javax.swing import JSplitPane
from javax.swing import ListSelectionModel

## ----------------------------------------
class TeamsListPanel(JPanel):

    groups = {
        "A": [                          # Group A
            {"rsa": "South Africa"},
            {"mex": "Mexico"},
            {"uru": "Uruguay"},
            {"fra": "France"},
            ],
        "B": [                          # Group B
            {"arg": "Argentina"},
            {"nga": "Nigeria"},
            {"kor": "Korea Republic"},
            {"gre": "Greece"},
            ],
        "C": [                          # Group C
            {"eng": "England"},
            {"usa": "USA"},
            {"alg": "Algeria"},
            {"svn": "Slovenia"},
            ],
        "D": [                          # Group D
            {"ger": "Germany"},
            {"aus": "Australia"},
            {"srb": "Serbia"},
            {"gha": "Ghana"},
            ],
        "E": [                          # Group E
            {"ned": "Netherlands"},
            {"den": "Denmark"},
            {"jpn": "Japan"},
            {"cmr": "Cameroon"},
            ],
        "F": [                          # Group F
            {"ita": "Italy"},
            {"par": "Paraguay"},
            {"nzl": "New Zealand"},
            {"svk": "Slovakia"},
            ],
        "G": [                          # Group G
            {"bra": "Brazil"},
            {"prk": "Korea DPR"},
            {"civ": "Cote d Ivoire"},
            {"por": "Portugal"},
            ],
        "H": [                          # Group H
            {"esp": "Spain"},
            {"sui": "Switzerland"},
            {"hon": "Honduras"},
            {"chi": "Chile"},
            ],
        }

    def __init__(self, master, *args, **keys):
        def teams():
            return [e for group in "ABCDEFGH"
                for team in self.groups[group] for e in team]
        
        listPane = self._listPane(
            teams(),
            minimumSize = (100,50),
            valueChanged = self,
            )
        picturePane = self._picturePane(
            minimumSize = (100,50),
            )
        master.contentPane = self._splitPane(
            leftComponent  = listPane,
            rightComponent = picturePane,
            )
        self._update()

    ## ----------------------------------------
    def _listPane(self, listData, minimumSize, **keys):
        def view(listData, **keys):
            self.list = \
            comp = JList(
                listData,
                selectionMode = ListSelectionModel.SINGLE_SELECTION,
                selectedIndex = 0,
                **keys
                )
            return comp

        comp = JScrollPane(
            viewportView = view(listData, **keys),
            minimumSize = minimumSize,
            )
        return comp

    def _picturePane(self, minimumSize):
        def view():
            self.picture = \
            comp = JLabel(
                horizontalAlignment = JLabel.CENTER,
                verticalTextPosition = JLabel.BOTTOM,
                horizontalTextPosition = JLabel.CENTER,
                )
            comp.font = comp.font.deriveFont(Font.ITALIC)
            return comp        

        comp = JScrollPane(
            viewportView = view(),
            minimumSize = minimumSize,
            )
        return comp

    def _splitPane(self, **keys):
        comp = JSplitPane(
            orientation = JSplitPane.HORIZONTAL_SPLIT,
            oneTouchExpandable = True,
            dividerLocation = 120,
            **keys
            )
        return comp        

    ## ----------------------------------------
    def __call__(self, e):  # ListSelectionListener.valueChanged
        self._update()

    def _update(self):
        def imageIcon(path):
            return ImageIcon(path) if exists(path) else None
        def name(key):
            for group in self.groups.values():
                for team in group:
                    if key in team:
                        return team[key]
            else:
                return None

        e = self.list.selectedValue
        icon = imageIcon("squad/%s.gif"%e)
        self.picture.icon = icon
        self.picture.text = name(e) if icon else "Image not found"

## ----------------------------------------
def tips():
    frame = JFrame(
        title = "2010 FIFA World Cup South Africa",
        size = (340,200),
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE,
        locationRelativeTo = None,
        )
    TeamsListPanel(frame)
    frame.show()

#===============================================================================
# 2008/03/11《1.2》Swing:JList
#------------------------------------------------------------------------------
# javax.swing.JList
#    public JList(Object[] listData)
#    public void setListData(Object[] listData)
#===============================================================================
#ex="ex_java_awt_Color"
def ex_java_awt_Color():
    from java.awt import Color
    def paintColor(e):
        s = e.source.selectedValue
        colorView.background = getattr(Color, s)

    listData = [
        'black', 'blue', 'cyan', 'darkGray',
        'gray', 'green', 'lightGray', 'magenta',
        'orange', 'pink', 'red', 'white', 'yellow',
        ]
    listView = JList(
        listData=listData,
        valueChanged=paintColor,
        )
    colorView = JPanel()
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="java.awt.Color",
        preferredSize=(180, 160),
        )
    frame.add(JScrollPane(listView), BorderLayout.WEST)
    frame.add(colorView, BorderLayout.CENTER)
    frame.pack()
    frame.show()

#===============================================================================
# See Also:
#    def ex_java_awt_Color()
#===============================================================================
#ex="ex_java_awt_Color1"
class ColorListPanel(JPanel):
    def __init__(self, listData):
        self.layout = BorderLayout()
        e = self.listView = JList(
            listData=listData,
            valueChanged=self.valueChanged,
            )
        self.add(JScrollPane(e), BorderLayout.WEST)
        e = self.colorView = JPanel(
            preferredSize=(120, 100),
            )
        self.add(e, BorderLayout.CENTER)
    def valueChanged(self, e):
        s = e.source.selectedValue
        self.colorView.background = getattr(Color, s)

def ex_java_awt_Color1():
    listData = [
        'black', 'blue', 'cyan', 'darkGray',
        'gray', 'green', 'lightGray', 'magenta',
        'orange', 'pink', 'red', 'white', 'yellow',
        ]
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="java.awt.Color #1",
        )
    frame.add(ColorListPanel(listData))
    frame.pack()
    frame.show()

#===============================================================================
# 2007/05/28《41》JList(1)もっと表示できるかな
#------------------------------------------------------------------------------
# javax.swing.JList
#    public JList(Object[] listData)
#    public void setListData(Object[] listData)
#===============================================================================
#ex="ex_JList"
def ex_JList():
    listData = list("ABCDEFGH")
    view = JList(
        listData=listData,
            # the array of Objects to be loaded into the data model
        )
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title=JList.__name__,
        )
    frame.add(JScrollPane(view))
    frame.pack()
    frame.show()

#===============================================================================
# javax.swing.JList
#    public void setLayoutOrientation(int layoutOrientation)
#    public void setVisibleRowCount(int visibleRowCount)
#===============================================================================
#ex="ex_JList_layoutOrientation"
def ex_JList_layoutOrientation():
    layoutOrientation = {}
    for e in (# default: VERTICAL
        'VERTICAL'       , # vertically in one column
        'VERTICAL_WRAP'  , # horizontally, wrapping to a new row
        'HORIZONTAL_WRAP', # vertically, wrapping to a new column
    ):
        layoutOrientation[e] = getattr(JList, e)

    listData = ["item%2d"%e for e in range(1, 13)]
    x, y, width, height = 10, 0, 210, 92

    for i, (title, layoutOrientation) in enumerate(
            layoutOrientation.items()):
        view = JList(
            listData=listData,
            layoutOrientation=layoutOrientation,
                # New orientation, one of JList.HORIZONTAL_WRAP,
                # JList.VERTICAL  or JList.VERTICAL_WRAP.
            visibleRowCount=-1,
                # an integer specifying the preferred number of
                # visible rows
            )
        frame = JFrame(
            defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
            title=title,
            bounds=((x+width)*i, y, width, height),
            )
        frame.add(JScrollPane(view))
        frame.show()

#===============================================================================
# 2007/05/29《42》JList(2)もっと選択できるかな
#------------------------------------------------------------------------------
# javax.swing.DefaultListModel
#    void setSelectionMode(int selectionMode)
#===============================================================================
#ex="ex_JList_selectionMode"
def ex_JList_selectionMode():
    selectionMode = {}
    for e in (
        'SINGLE_SELECTION'           , # only one list index
        'SINGLE_INTERVAL_SELECTION'  , # one contiguous index interval
        'MULTIPLE_INTERVAL_SELECTION', # there's no restriction
    ):
        selectionMode[e] = getattr(ListSelectionModel, e)

    listData = ["item%2d"%e for e in range(1, 10)]
    x, y, width, height = 10, 0, 280, 180

    for i, (title, selectionMode) in enumerate(
            selectionMode.items()):
        view = JList(
            listData=listData,
            selectionMode=selectionMode,
                # an integer specifying the type of selections
                # that are permissible
            )
        frame = JFrame(
            defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
            title=title,
            bounds=((x+width)*i, y, width, height),
            )
        frame.add(JScrollPane(view))
        frame.show()

#===============================================================================
# 2007/05/30《43》JList(3)選択したらどうなるの
#------------------------------------------------------------------------------
# javax.swing.JList
#    public Object getSelectedValue()
#    public int getSelectedIndex()
# javax.swing.event.ListSelectionListener
#    public void valueChanged(ListSelectionEvent e)
#===============================================================================
#ex="ex_JList_valueChanged"
def ex_JList_valueChanged():
    from pawt import colors
    def valueChanged(e):
        # e - the event that characterizes the change.
        s = e.source.selectedValue
        colorView.background = getattr(colors, s)

    listData = [e for e in dir(colors)
        if not e.startswith("_")]
    listView = JList(
        listData=listData,
        layoutOrientation=JList.VERTICAL_WRAP,
        visibleRowCount=-1,
        valueChanged=valueChanged,
            # Called whenever the value of the selection changes.
        )
    colorView = JPanel(
        preferredSize=(100, 100),
        )
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="JList: pawt.colors",
        bounds=(0, 0, 360, 128),
        )
    frame.add(JScrollPane(listView), BorderLayout.CENTER)
    frame.add(colorView, BorderLayout.EAST)
#    frame.pack()
    frame.show()

#------------------------------------------------------------------------------
#------------------------------------------------------------------------------

#===============================================================================
# See Also:
#    def ex_java_awt_Color()
#===============================================================================
#ex="exJPanel_color"
def exJPanel_color():
    panel = JPanel(layout=BorderLayout())

    color = [e for e in dir(colors) if not e.startswith("__")]
    def paint(e):
        panel.background = getattr(colors, e.source.selectedValue)
    view = JList(listData=color, valueChanged=paint)
    panel.add(JScrollPane(view), BorderLayout.WEST)

    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        size=(220, 100), title="JPanel #colors")
    frame.add(panel)
    frame.visible = True

from pawt import colors
def ex_pawt_Color():
    listData = [
        e for e in dir(colors) if not e.startswith("_")
        ]
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="from pawt import colors",
        )

    def this_valueChanged(e):
        panel.colorView.background = eval(
            "colors.%s"%e.source.selectedValue)
    panel = ColorListPanel(listData)
    panel.listView.valueChanged = this_valueChanged

    frame.add(panel)
    frame.pack()
    frame.show()

#------------------------------------------------------------------------------
#------------------------------------------------------------------------------

#===============================================================================
# 2007/05/31《44》JList(4)モデルになってくれませんか
#------------------------------------------------------------------------------
# javax.swing.JList
#    public JList(ListModel dataModel)
#    public void setModel(ListModel model)
# javax.swing.DefaultListModel
#    public void addElement(Object obj)
#    public Object remove(int index)
#===============================================================================
#ex="ex_DefaultListModel"
def ex_DefaultListModel():
    model = DefaultListModel()
    for e in "ABCDEFGH":
        model.addElement(e)

    listView = JList(
        model=model,
        )
    frame = JFrame(
        defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="DefaultListModel",
        bounds=(0, 0, 200, 100),
        )
    frame.add(JScrollPane(listView))
    frame.visible = True

#===============================================================================
#
#===============================================================================
from random import *
def exSw_JList_stack():
    def push(e):
        view.model.addElement("item #%2d"%(random()*100))

    def pop(e):
        index = view.model.size()
        if index > 0:
            view.model.remove(index-1)
        else:
            print ">>> stack is empty"

    def pop(e):
        view.model.remove(view.model.size()-1)
        if view.model.empty:
            e.source.enabled = False

    view = JList(model=DefaultListModel())
    panel = JPanel(preferredSize=(80, 100))
    for e, b in (push, True), (pop, False):
        panel.add(JButton(
            label=e.__name__, enabled=b, actionPerformed=e))

    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="JList: stack", bounds=(0, 0, 200, 100))
    frame.add(JScrollPane(view), BorderLayout.CENTER)
    frame.add(panel, BorderLayout.EAST)
    frame.visible = True

#===============================================================================
#    public void addListSelectionListener(ListSelectionListener listener)
#===============================================================================
from javax.swing.event import ListSelectionListener

def ex04_ListSelectionListener():
    model = DefaultListModel()
    for e in "ABCDEFGH":
        model.addElement(e)

    class Listener(ListSelectionListener):
        def valueChanged(self, e):
            index = e.source.selectedIndex
            value = e.source.selectedValue
            print "%d: %s"%(index, value)

    view = JList(model=model)
    view.addListSelectionListener(Listener())

    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        size=(250, 100), title="JList #ListSelectionListener")
    frame.add(JScrollPane(view))
    frame.visible = True

#===============================================================================
#
#===============================================================================
class ListPanel(JPanel, ListSelectionListener):
    def __init__(self, model):
        self.layout = BorderLayout()
        self.model = self._model(model)
        self.list  = self._list()
        self.field = self._field()

    def _model(self, data):
        model = DefaultListModel()
        for e in data:
            model.addElement(e)
        return model

    def _list(self):
        view = JList(
            model=self.model, valueChanged=self.valueChanged)
        self.add(JScrollPane(view), BorderLayout.CENTER)
        return view

    def _field(self):
        comp = JTextField()
        self.add(comp, BorderLayout.SOUTH)
        return comp

    def valueChanged(self, e):
        self.field.text = e.source.selectedValue

def ex06_JList_Panel():
    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="dir(JList)")
    frame.add(ListPanel(dir(JList)))
    frame.pack()
    frame.visible = True

#===============================================================================
#    javax.swing.DefaultListModel
#    void addElement(Object obj)
#    void clear()
#===============================================================================
def exJList_edit():
    listData = dir(str)
    model = DefaultListModel()
    for e in listData:
        model.addElement(e)
    view = JList(model=model)

    def action(e):
        if e.source.isSelected():
            data = listData
        else:
            data = [e for e in listData if not e.startswith("__")]
        view.model.clear()
        for e in data:
            view.model.addElement(e)
    button = JCheckBox(
        label="built-in", selected=True, actionPerformed=action)

    panel = JPanel(layout=BorderLayout())
    panel.add(JScrollPane(view), BorderLayout.CENTER)
    panel.add(button, BorderLayout.NORTH)

    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        size=(150, 100), title="JList")
    frame.add(panel)
    frame.visible = True

def exJList_edit2():
    object = str
    listData = dir(object)
    model = DefaultListModel()
    for e in listData:
        model.addElement(e)

    def action(e):
        if e.source.isSelected():
            data = listData
        else:
            data = [e for e in listData if not e.startswith("__")]
        listView.model.clear()
        for e in data:
            listView.model.addElement(e)
    button = JCheckBox(
        label="built-in", selected=True, actionPerformed=action)

    def valueChanged(e):
        attr = getattr(object, e.source.selectedValue)
        textView.text = attr.__class__.__name__
    listView = JList(model=model, valueChanged=valueChanged)

    textView = JTextArea()

    panel = JPanel(layout=BorderLayout())
    panel.add(JScrollPane(listView), BorderLayout.CENTER)
    panel.add(button, BorderLayout.NORTH)

#    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
    frame = JFrame(
        size=(250, 100), title="JList")
    frame.add(panel, BorderLayout.WEST)
    frame.add(JScrollPane(textView), BorderLayout.CENTER)
    frame.visible = True

#===============================================================================
#    dir(JList)
#===============================================================================
def ex00_dir_JList():
    def valueChanged(e):
        index = e.source.selectedIndex
        value = e.source.selectedValue
        print "%s: %s"%(index, value)

    frame = JFrame(defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
        title="dir(JList)",
        )
    frame.add(JScrollPane(
        JList(listData=dir(JList), valueChanged=valueChanged)))
    frame.pack()
    frame.visible = True

#===============================================================================
def _ex_dir(ex):
    instance = JList()
    c = JList()
    c.model = DefaultListModel()
    c.addListSelectionListener(Dir_Listener(instance))
    for s in dir(instance):
        c.model.addElement(s)

    J = ExFrame((0, 0), (250, 200), instance.__class__.__name__)
    frame = J.frame
    frame.add(JScrollPane(c))
    frame.visible = True

class Dir_Listener(ListSelectionListener):

    def __init__(self, instance):
        self.inst = instance

    def valueChanged(self, e):
        r = e.source.selectedValue
        x = self.inst
        print "%s: %s"%(r, eval('type(x.%s)'%r))

#------------------------------------------------------------------------------
##exec "print_ex('%s'); %s()"%(ex, ex)
#===============================================================================

## ----------------------------------------
from doctest import testmod

if __name__=='__main__':
    inform()
    testmod()

## ========================================