余録:wcStage2View.py

#! /usr/bin/env python
# coding: utf-8

## ----------------------------------------
from java.awt import BorderLayout
from java.awt import Color
from javax.swing import ImageIcon
from javax.swing import JFrame
from javax.swing import JLabel
from javax.swing import JPanel
from javax.swing import JScrollPane
from javax.swing import JSplitPane
from javax.swing import JTable
from javax.swing import JTree
from javax.swing.table import DefaultTableCellRenderer
from javax.swing.table import DefaultTableModel
from javax.swing.table import TableCellRenderer
from javax.swing.tree import DefaultMutableTreeNode
from javax.swing.tree import DefaultTreeCellRenderer;

from os.path import dirname, exists
from sys import argv

from wcModel import WcModel
from wcTeamView import MyTableCellRenderer

## ----------------------------------------
class Stage2Panel(JPanel):
    def __init__(self, *args, **keys):
        super(JPanel,self).__init__(
            layout = BorderLayout(),
            **keys
            )
        path = "%s/squad"%(dirname(argv[-1]))
        
        def treeView(team=None):
            self.rootNode = \
            final = DefaultMutableTreeNode("Final #64")

            semi = 
            form = "Semi-finals #%d"
            for i, matches in enumerate(
                [(61,62)]
                ):
                for e in matches:
                    node = DefaultMutableTreeNode(form%e)
                    final.add(node)
                    semi.append(node)

            quarter = 
            form = "Quarter-finals #%d"
            for i, matches in enumerate(
                [(58,57),(59,60)]
                ):
                for e in matches:
                    node = DefaultMutableTreeNode(form%e)
                    semi[i].add(node)
                    quarter.append(node)

            form = "Round of 16 #%d"
            for i, matches in enumerate(
                [(49,50),(53,54),(51,52),(55,56)]
                ):
                for e in matches:
                    node = DefaultMutableTreeNode(form%e)
                    quarter[i].add(node)

            tree = JTree(
                final,
                valueChanged = self,
                )
            return tree

        def tableModel(group=None):
            class MyTableModel(DefaultTableModel):
                def getColumnClass(self, c):
                    return self.getValueAt(0, c).__class__

            columnNames = "date-time", "home", "score", "away",
            self.model = \
            model = MyTableModel()
            for e in columnNames:
                model.addColumn(e)
            match = self.rootNode.userObject[-2:]
            _,date,_,_,home,score,away,_ = self._scores(match)
            model.addRow([date,home,score,away])
            return model
            
        def tableView():
            self.table = \
            comp = JTable(
                model = tableModel(),
                rowHeight = 60,
                )
            # public void javax.swing.JTable.
            #   setDefaultRenderer()
            comp.setDefaultRenderer(
                ImageIcon,              # java.lang.Class
                MyTableCellRenderer(),  # javax.swing.table.TableCellRenderer
                )
            return comp
        
        def _splitPane(**keys):
            comp = JSplitPane(
                orientation = JSplitPane.VERTICAL_SPLIT,
                oneTouchExpandable = True,
                dividerLocation = 180,
                **keys
                )
            return comp

        def splitPane():
            controlPane = JScrollPane(
                viewportView = treeView(),
                preferredSize = (280,200),
                )
            canvasPane = JScrollPane(
                viewportView = tableView(),
                preferredSize = (320,100),
                )
            return _splitPane(
                topComponent    = controlPane,
                bottomComponent = canvasPane,
                )

        pane = splitPane()
        self.add(pane)

    def show():
        frame = JFrame(
            title = "-- Stage2 --",
            size = (350,300),
            locationRelativeTo = None,
            )
        frame.add(Stage2Panel())
        frame.visible = True

    def _scores(self, match):
        def valid(line, match):
            return line.startswith(match)

        path = "%s/matches/stage2.txt"%dirname(argv[-1])
        lines = open(path).readlines() if exists(path) else []
        for line in lines:
            if valid(line, match): break
        return line.split("\t")        

    def __call__(self, e):
        node = e.source.lastSelectedPathComponent
        match = node.userObject[-2:]
        _,date,_,_,home,score,away,_ = self._scores(match)

        path = "%s/squad"%(dirname(argv[-1]))
        def team(key):
            m = WcModel.teamNames
            return ImageIcon("%s/%s.gif"%(path, m[key])) if key in m else key

        rowIndex = 0
        for columnIndex,aValue in enumerate([
            date,
            team(home),
            score,
            team(away),
            ]):
            self.model.setValueAt(aValue, rowIndex, columnIndex) 
        
## ========================================

Jython/Swing《余録》2010 FIFA World Cup South Africa™

記事一覧Java.use(better, Jython=Swing)《Jython2.5》《復刻改訂版》
Java プログラマーのための Python 導入ガイド -- 2010 FIFA World Cup South Africa™

《余録》JTable: 決勝トーナメント

《著》伊藤うさぎ、森こねこ《監修》小粒ちゃん@湘南組、小粒ちゃん@博多組
第1版♪2003/12/29 ● 第2版♪2006/10/02 ● 第3版♪2010/06/11

2010 FIFA World Cup の開催を機に、Jython2.5 で再構成しました。


》作業中です《

課題:2010 FIFA World Cup South Africa™

要求仕様

2010 FIFA World Cup South Africa™ 全試合の戦績を、グループリーグ、決勝トーナメント別に表示したい。

  • モジュールを起動すると、
$ jython -i wcExample.py
>>> 




次のようなウィンドウが現れます。そこで、

試合 #55 のツリー項目を選択すると、

日本チーム Japan (jpn) の戦績が表示されます。

《余録》日本チームは PK 戦で敗退となりましたが、その足跡をここに残します。2010-06-29

以下の公式サイトから得られる情報をもとに、

その内容を反映したテキストファイル matches/stage2.txt から各チームの戦績を読み込んで、テーブル JTable 内に表示します。

% cat matches/stage2.txt
# http://www.fifa.com/worldcup/matches/index.html
Round of 16
Match	Date - Time	Venue			Results		
49	26/06 23:00	Nelson Mandela Bay/Port Elizabeth		Uruguay	2:1 (1:0) 	Korea Republic	
...
55	29/06 23:00	Tshwane/Pretoria		Paraguay	0:0 a.e.t. 5:3 PSO 	Japan	
...
Quarter-finals
Match	Date - Time	Venue			Results		
57	02/07 23:00	Nelson Mandela Bay/Port Elizabeth		Netherlands	2:1 (0:1) 	Brazil	
...
Semi-finals
Match	Date - Time	Venue			Results		
61	07/07 03:30	Cape Town		Uruguay	2:3 (1:1) 	Netherlands	
...
Match for third place
Match	Date - Time	Venue			Results		
63	11/07 03:30	Nelson Mandela Bay/Port Elizabeth		Uruguay	Background	Germany	
Final
Match	Date - Time	Venue			Results		
64	12/07 03:30	Johannesburg		Netherlands	Background	Spain	
...

TOP
》作業中です《


関連記事

Last updated♪2010/06/25