JTabbedPaneを使ってみる




::::::::::::::
AccountInfo.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class AccountInfo {
    private String id;
    private String passwd;
    private String fullName;

    public AccountInfo( String id, String passwd, String fullName ) {
        this.id = id;
        this.passwd = passwd;
        this.fullName = fullName;
    }

    public String getID() {
        return id;
    }
    public String getPasswd() {
        return passwd;
    }
    public String getFullName() {
        return fullName;
    }
}

::::::::::::::
AccountManager.java
::::::::::::::
import javax.xml.parsers.*;
import org.w3c.dom.*;

import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* アカウントを管理するクラス
* シングルトンにしなければならない
*/

public class AccountManager {

    private static final String CONF_FILE = "../conf/config.xml";

    private static AccountManager uniqueInstance = null;

    private static Map userAccountMap;
    /** 現在ログインしているユーザ */
    private static Set loginUsers;

    public static AccountManager getInstance() throws Exception {
        if ( uniqueInstance == null ) {
            uniqueInstance = new AccountManager();
            System.out.println( uniqueInstance.getClass().getName() + " がインスタンス化されました。" );

            userAccountMap = new HashMap();
            loginUsers = new HashSet();

            readConfiguration();
        }

        return uniqueInstance;

    }

    private static void readConfiguration() throws Exception {

        try {
            // ドキュメントビルダーファクトリを生成
            DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

            // ドキュメントビルダーを生成
            DocumentBuilder builder = dbfactory.newDocumentBuilder();

            // パースを実行してDocumentオブジェクトを取得
            Document document = builder.parse( new File( CONF_FILE ) );

            Node node = document.getDocumentElement();
            processUser( node );

        } catch ( Exception e ) {
            throw e;
        }

    }

    private static void processUser( Node node ) {
        // 子要素のリストを取得
        Node childNode = node.getFirstChild();

        while ( childNode != null ) {
            String nodeName = childNode.getNodeName();

            if ( "user".equals( nodeName ) ) {
                // getAttribute()はElementクラスが持つメソッドなのでキャストする必要がある
                String id = ( ( Element ) childNode ).getAttribute( "id" );

                processProperties( id, childNode );

            }
            childNode = childNode.getNextSibling();
        }
    }

    /**
    * 特定のユーザのID、ログイン名、パスワード、フルネームを取得してMapに書き込む
    */
    private static void processProperties( String id, Node node ) {
        System.out.println( "id=" + id );

        // 子要素のリストを取得
        Node childNode = node.getFirstChild();

        String loginName = null;
        String passwd = null;
        String fullName = null;
        while ( childNode != null ) {
            String nodeName = childNode.getNodeName();


            if ( "loginName".equals( nodeName ) ) {
                loginName = childNode.getFirstChild().getNodeValue();
                System.out.println( nodeName + ":" + loginName );
            }
            if ( "passwd".equals( nodeName ) ) {
                passwd = childNode.getFirstChild().getNodeValue();
                System.out.println( nodeName + ":" + passwd );
            }
            if ( "fullName".equals( nodeName ) ) {
                fullName = childNode.getFirstChild().getNodeValue();
                System.out.println( nodeName + ":" + fullName );
            }


            childNode = childNode.getNextSibling();
        }

        userAccountMap.put( loginName, new AccountInfo( id, passwd, fullName ) );

    }

    /**
    * ユーザ認証をする
    */
    public boolean authenticateUser( String loginName, String passwd ) {
        if ( !userAccountMap.containsKey( loginName ) ) {
            return false;
        }

        AccountInfo aInfo = ( AccountInfo ) userAccountMap.get( loginName );
        String realPasswd = aInfo.getPasswd();

        return ( realPasswd.equals( passwd ) );
    }

    public static void main( String[] args ) throws Exception {

        boolean status;

        System.out.println();

        AccountManager manager = AccountManager.getInstance();
        status = manager.authenticateUser( "yamayama", "aaaaaa" );
        System.out.println( status );
        status = manager.authenticateUser( "suzuki", "suzuki" );
        System.out.println( status );


        AccountManager manager2 = AccountManager.getInstance();
        status = manager.authenticateUser( "yamada", "yamada" );
        System.out.println( status );

    }
}
::::::::::::::
Attribute.java
::::::::::::::
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/
public class Attribute {
    /**
    * 属性名称
    */
    private String name;
    /** 画面に表示するための名称 */
    private String displayName;
    /** 属性の種別 */
    private AttributeType type;
    private List enumList;
    private String tableName = null;

    public Attribute( String name, AttributeType type, String displayName ) {
        this.name = name;
        this.type = type;
        this.displayName = displayName;
    }

    public String getName() {
        return name;
    }

    public String getDisplayName() {
        return displayName;
    }

    /**
    * アトリビュートの種別を返す
    */
    public AttributeType getType() {
        return type;
    }

    public void setEnumList( List enumList ) throws Exception {
        if ( type != AttributeType.ENUM ) {
            throw new Exception( "属性がENUMでありません。" );
        }

        this.enumList = enumList;
    }

    public void addEnumValue( Object object ) throws Exception {
        if ( type != AttributeType.ENUM ) {
            throw new Exception( "属性がENUMでありません。" );
        }

        if ( enumList == null ) {
            enumList = new LinkedList();
        }
        enumList.add( object );

    }

    public List getEnumList() throws Exception {
        if ( type != AttributeType.ENUM ) {
            throw new Exception( "属性がENUMでありません。" );
        }

        return enumList;
    }

    public void setTableName( String tableName ) throws Exception {
        if ( type != AttributeType.TABLE_MAPPED ) {
            throw new Exception( "属性がTABLE_MAPPEDでありません。" );
        }
        this.tableName = tableName;
    }

    public String getTableName( ) throws Exception {
        if ( type != AttributeType.TABLE_MAPPED ) {
            throw new Exception( "属性がTABLE_MAPPEDでありません。" );
        }
        return tableName;
    }



}
::::::::::::::
AttributeComponent.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class AttributeComponent {

    private JLabel label;
    private JComponent component;
    private Attribute attribute;

    public AttributeComponent( String name, Attribute attribute ) {
        this.label = new JLabel( name );
        this.attribute = attribute;

        if ( attribute.getType() == AttributeType.ENUM ) {
            // attributeからEnumのリストを取得
            try {
                java.util.List list = attribute.getEnumList();
                Object[] values = new Object[ list.size() ];
                for ( int i = 0;i < list.size();i++ ) {
                    values[ i ] = list.get( i );
                }
                component = new JComboBox( values );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

    public Attribute getAttribute() {
        return attribute;
    }

    public JLabel getLabel() {
        return label;
    }
    public JComponent getComponent() {
        return component;
    }
}
::::::::::::::
AttributeManager.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* シングルトンにしなければならない
*/

public class AttributeManager {

    private static AttributeManager uniqueInstance = null;

    private static Map nameMap;

    private AttributeManager() {
        nameMap = new TreeMap();
    }

    public static AttributeManager getInstance() {
        if ( uniqueInstance == null ) {
            uniqueInstance = new AttributeManager();
            System.out.println( uniqueInstance.getClass().getName() + " がインスタンス化されました。" );
        }

        return uniqueInstance;
    }

    public static void putNameMap( Attribute attribute ) {
        nameMap.put( attribute.getName(), attribute );
    }

    public static Attribute getAttributeByName( String name ) {
        return ( Attribute ) nameMap.get( name );
    }

}
::::::::::::::
AttributeType.java
::::::::::::::
public enum AttributeType {

    NORMAL, ENUM, TABLE_MAPPED;
}

::::::::::::::
BaseUpdationAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

abstract public class BaseUpdationAction extends AbstractAction implements Executable {

    /** 更新情報の送信元パネル */
    protected BaseUpdationPanel panel;

    /** ボタンを押したときの状況を取得するための参照 */
    protected Object[] context;

    public void actionPerformed( ActionEvent event ) {

        try {
            execute();
        } catch ( Exception e ) {
            // e.printStackTrace();
            System.err.println( e.toString() );
        }
    }

    public BaseUpdationAction() {
        super();
    }

    protected void setContext( Object[] context ) {
        this.context = context;
    }

    /** パネルをセットする */
    protected void setPanel( BaseUpdationPanel panel ) {
        this.panel = panel;
    }

    /** 引き渡されたコンテキストを元になんらかの処理を実行する */
    public void execute() throws Exception {
        System.out.println( "実行されたアクションクラス=" + this.getClass().getName() );

        doAction();

        // 更新とともにリロード
        panel.reload();

        // 更新をされたことを通知する
        ItemManager manager = ItemManager.getInstance();
        manager.castUpdateMessage();
    }

    /** アイテムを実際に更新するメソッド */
    abstract protected void doAction() throws Exception;
}

::::::::::::::
BaseUpdationPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public abstract class BaseUpdationPanel extends TSCommonPanel implements ActionListener {

    /** GUIDを入力するためのテキストフィールド */
    protected JTextField guid;

    /**
    * 全アイテムタイプあるいは特定のアイテムタイプを選択するためのJComboBox
    */
    protected JComboBox filterComboBox;

    /** 処理対象アイテム一覧を表示するテーブル */
    protected JTable table;

    /** 処理対象アイテムのステータス(複数) */
    protected String[] valuesOfStatus;

    /** 入力フォーム */
    protected InputFormPanel inputFormPanel;

    /** このView(=パネル)と対になるアクション */
    protected BaseUpdationAction action;

    /** キー入力を検知するためのキーアダプタ **/
    protected MyKeyAdapter adapter;

    protected JPanel statusPanel;
    protected JLabel statusLabel;

    protected JComponent focusedComponent = null;

    /**
    * @param valuesOfStatus この画面で処理対象となるアイテムのステータス
    * @param action この画面に対応するアクションクラス
    */
    protected BaseUpdationPanel( String[] valuesOfStatus, BaseUpdationAction action ) {
        super();

        this.valuesOfStatus = valuesOfStatus;
        this.action = action;

        // アクションにこのPanelの参照を引き渡す
        action.setPanel( this );

        // キー入力を検知するためのキーアダプタの設定
        adapter = new MyKeyAdapter();
        adapter.setAction( action );
        adapter.setPanel( this );

        // フィルターを設定するためのComboBox
        ItemManager manager = ItemManager.getInstance();
        java.util.List list = manager.getAvailableItemTypes();
        Object[] names = new Object[ list.size() + 1 ];
        names[ 0 ] = "全アイテムタイプ";
        for ( int i = 1;i < list.size() + 1;i++ ) {
            ItemType itemType = ( ItemType ) list.get( i - 1 );
            names[ i ] = itemType.getName();
        }
        filterComboBox = new JComboBox( names );
        filterComboBox.addActionListener( this );
        filterComboBox.setActionCommand( "CHANGE_ITEMTYPE" );

        JPanel panel4comboBox = new JPanel();
        panel4comboBox.add( new JLabel( "アイテム種別" ) );
        panel4comboBox.add( filterComboBox );
        addComponent( panel4comboBox, 0, 0, 1, 1 );

        // 処理対象となるアイテムを表示するためのJTable
        table = new JTable( );
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        JScrollPane sp = new JScrollPane( table );
        sp.setPreferredSize( new Dimension( 920, 360 ) );
        addComponent( sp, 0, 1, 1, 1 );

        // 余白を入れる
        addComponent( new JLabel( "    " ), 0, 3, 1, 1 );

        // 入力フォームを配置
        inputFormPanel = new InputFormPanel();
        addComponent( inputFormPanel, 0, 4, 1, 1 );

        // 入力フォームを描画する
        renderInputForm();
        doFocus();

        // ステータスパネル
        statusPanel = new JPanel();
        statusLabel = new JLabel();
        statusPanel.add( statusLabel );

        addComponent( statusPanel, 0, 5, 1, 1 );
    }

    /**
    * メッセージを下部パネル内に表示する
    */
    protected void setStatusMessage( String message ) {
        statusLabel.setText( message );
    }

    /** このステップで処理対象となるアイテムのステータスをListで返す */
    protected java.util.List getSourceStatusList() {
        java.util.List sourceStatusList = new LinkedList();
        for ( int i = 0;i < valuesOfStatus.length; i++ ) {
            sourceStatusList.add( valuesOfStatus[ i ] );
        }
        return sourceStatusList;
    }

    /** 指定されたステータスを保有するアイテムを全て列挙する */
    protected synchronized void getAllItems() {
        System.out.println( "getAllItems()" );

        DefaultTableModel model = new DefaultTableModel();
        Object[] columnNames = {"個体識別番号", "アイテム種別", "ステータス", "登録日時", "更新日時", "オペレータ"};
        model.setColumnIdentifiers( columnNames );

        ItemManager manager = ItemManager.getInstance();
        Map map = manager.getGUIDIndex();
        Iterator iterator = map.keySet().iterator();

        while ( iterator.hasNext() ) {
            Integer guid = ( Integer ) iterator.next();
            Item item = ( Item ) map.get( guid );
            String status = ( String ) item.getAttributeValue( "STATUS" );
            Object createdDate = item.getAttributeValue( "CREATED_DATE" );
            Object lastUpdatedDate = item.getAttributeValue( "LAST_UPDATED_DATE" );
            Object operator = item.getAttributeValue( "OPERATOR" );
            ItemType itemType = item.getItemType();
            String itemTypeName = itemType.getName();

            boolean found = false;
            for ( int i = 0;i < valuesOfStatus.length;i++ ) {
                if ( status.equals( valuesOfStatus[ i ] ) ) {
                    found = true;
                    break;
                }
            }
            if ( !found ) {
                continue;
            }

            Object[] rec = new Object[ 6 ];
            rec[ 0 ] = guid;
            rec[ 1 ] = itemTypeName;
            rec[ 2 ] = status;
            rec[ 3 ] = createdDate;
            rec[ 4 ] = lastUpdatedDate;
            rec[ 5 ] = operator;
            model.addRow( rec );
        }

        TableSorter sorter = new TableSorter( model );
        table.setModel( sorter );
        sorter.setTableHeader( table.getTableHeader() );

        // 各カラムの表示幅を指定する
        int[] width = new int[ columnNames.length ];
        width[ 0 ] = 100;
        width[ 1 ] = 100;
        width[ 2 ] = 220;
        width[ 3 ] = 120; // 登録日付
        width[ 4 ] = 120; // 更新日付
        width[ 5 ] = 100;
        for ( int i = 0;i < width.length;i++ ) {
            TableColumn col = table.getColumnModel().getColumn( i );
            col.setMinWidth( width[ i ] );
            col.setMaxWidth( width[ i ] );
        }

        this.validate();
        this.repaint();
    }

    /** リロードする */
    protected void reload() {
        String selectedItemTypeName = ( String ) filterComboBox.getSelectedItem();
        if ( "全アイテムタイプ".equals( selectedItemTypeName ) ) {
            getAllItems();
        } else {
            DefaultTableModel model = SpecificItemsRetriever.retrieve( valuesOfStatus, selectedItemTypeName );

            TableSorter sorter = new TableSorter( model );
            table.setModel( sorter );
            sorter.setTableHeader( table.getTableHeader() );

            // 表示する項目を決定する
            setVisibleColomns( selectedItemTypeName );

            this.validate();
            this.repaint();
        }

        doFocus();
    }

    /**
    * 表示すべき項目を決定する
    * @param selectedItemTypeName 選択されたアイテムタイプ
    */
    protected abstract void setVisibleColomns( String selectedItemTypeName );


    /** フォーカスするコンポーネントを指定 */
    private void doFocus() {

        if ( focusedComponent != null ) {
            focusedComponent.requestFocusInWindow();
            this.validate();
            this.repaint();
        }
    }

    /** フォーカスするコンポーネントを指定する */
    protected void setFocusedComponent( JComponent component ) {
        this.focusedComponent = component;
    }

    public void actionPerformed( ActionEvent event ) {

        String command = event.getActionCommand();
        System.out.println( "COMAND: " + command );

        if ( "CHANGE_ITEMTYPE".equals( command ) ) {
            reload();
        }
    }

    /**
    * アイテムの属性を更新するためのフォームを表示する 
    */
    public void renderInputForm() {
        createInputForm();

        table.addMouseListener( new RowSelection( guid ) );
    }

    /**
    * アイテムの属性を更新するためのフォームを作成する 
    */
    protected abstract void createInputForm();
}
::::::::::::::
CheckInAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class CheckInAction extends BaseUpdationAction {
    private final String STATUS = "CHECK_IN";

    public CheckInAction() {
        super();
    }

    public void doAction() throws Exception {
        JTextField guid = ( JTextField ) context[ 0 ];
        JComboBox options = ( JComboBox ) context[ 1 ];
        Object warehouseName = options.getSelectedItem();

        if ( guid.getText().length() == 0 ) {
            throw new Exception( "GUIDが入力されていません!" );
        }

        // 選択されたアイテムの属性を更新(この情報は、パネルが持っている)
        java.util.List sourceStatusList = panel.getSourceStatusList();
        try {
            // アイテムのステータスを更新する
            ItemStatusUpdater.update( guid.getText(), sourceStatusList, STATUS, panel.getLoginName() );

            // 修理業者の情報をセットする
            ItemManager manager = ItemManager.getInstance();
            Integer iGuid = new Integer( guid.getText() );
            Item item = manager.getItemByGUID( iGuid );
            item.updateAttribute( "WAREHOUSE", warehouseName );

            // 状態遷移履歴を格納
            ItemHistory history = ItemHistory.getInstance();
            history.insertLog( item );

        } catch ( Exception e ) {
            // System.err.println( e.toString() );
            e.printStackTrace();
        }

        // GUIDの入力フィールドをクリア
        guid.setText( "" );

    }
}

::::::::::::::
CheckInPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class CheckInPanel extends BaseUpdationPanel {

    // private JTextField guid;
    private JComboBox options;

    public CheckInPanel() {
        super( new String[] {"AVAILABLE"}, new CheckInAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {
        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        //==============================================================
        // Table-Mapped Attributeからリストを取得
        //==============================================================
        Object[][] warehouse;
        try {
            warehouse = TableMappedAttributeProvider.provide( "Warehouse" );
        } catch ( Exception e ) {
            System.err.println( e.toString() );
            return ;
        }

        // ラベル
        inputFormPanel.addComponent( new JLabel( "倉庫" ), 2, 0, 1, 1 );

        // セットする属性値の選択肢
        Object[] names = new Object[ warehouse.length ];
        for ( int i = 0;i < names.length;i++ ) {
            names[ i ] = warehouse[ i ][ 1 ];
        }
        options = new JComboBox( names );
        inputFormPanel.addComponent( options, 3, 0, 1, 1 );

        // 送信ボタン
        JButton submit = new JButton( "送信" );
        submit.addActionListener( action );
        submit.setActionCommand( "CHECK_IN" );
        inputFormPanel.addComponent( submit, 4, 0, 1, 1 );
        submit.addKeyListener( adapter );

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 2 ];
        context[ 0 ] = guid;
        context[ 1 ] = options;
        action.setContext( context );

    }

    public void setVisibleColomns( String selectedItemTypeName ) {}
}
::::::::::::::
CheckOutAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class CheckOutAction extends BaseUpdationAction {
    private final String STATUS = "CHECK_OUT";

    public CheckOutAction() {
        super();
    }

    public void doAction() throws Exception {
        JTextField guid = ( JTextField ) context[ 0 ];
        JComboBox options = ( JComboBox ) context[ 1 ];
        Object assemblyLineName = options.getSelectedItem();

        if ( guid.getText().length() == 0 ) {
            throw new Exception( "GUIDが入力されていません!" );
        }

        // 選択されたアイテムの属性を更新(この情報は、パネルが持っている)
        java.util.List sourceStatusList = panel.getSourceStatusList();
        try {
            // アイテムのステータスを更新する
            ItemStatusUpdater.update( guid.getText(), sourceStatusList, STATUS , panel.getLoginName() );

            // 修理業者の情報をセットする
            ItemManager manager = ItemManager.getInstance();
            Integer iGuid = new Integer( guid.getText() );
            Item item = manager.getItemByGUID( iGuid );
            item.updateAttribute( "ASSEMBLY_LINE", assemblyLineName );

            // もしアイテムが利用回数(USE_COUNT)という属性を持っている場合には利用回数をカウントアップ
            // リモートコンポーネントとして取り合うことも検討する
            Map map = item.getAttributeMap();
            if ( map.containsKey( "USE_COUNT" ) ) {
                Object useCountValue = item.getAttributeValue( "USE_COUNT" );
                if ( useCountValue == null ) {
                    item.updateAttribute( "USE_COUNT", new Integer( 1 ) );
                } else {
                    int value = ( ( Integer ) useCountValue ).intValue();
                    item.updateAttribute( "USE_COUNT", new Integer( value + 1 ) );
                }
            }

            // 状態遷移履歴を格納
            ItemHistory history = ItemHistory.getInstance();
            history.insertLog( item );

        } catch ( Exception e ) {
            // System.err.println( e.toString() );
            e.printStackTrace();
        }

        // GUIDの入力フィールドをクリア
        guid.setText( "" );


    }
}

::::::::::::::
CheckOutPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class CheckOutPanel extends BaseUpdationPanel {

    private JComboBox options;

    public CheckOutPanel() {
        super( new String[] {"AVAILABLE_BEFORE_CHECK_OUT"}, new CheckOutAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {
        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        //==============================================================
        // Table-Mapped Attributeからリストを取得
        //==============================================================
        Object[][] assemblyLine;
        try {
            assemblyLine = TableMappedAttributeProvider.provide( "AssemblyLine" );
        } catch ( Exception e ) {
            System.err.println( e.toString() );
            return ;
        }

        // ラベル
        inputFormPanel.addComponent( new JLabel( "製造ライン" ), 2, 0, 1, 1 );

        // セットする属性値の選択肢
        Object[] names = new Object[ assemblyLine.length ];
        for ( int i = 0;i < names.length;i++ ) {
            names[ i ] = assemblyLine[ i ][ 1 ];
        }
        options = new JComboBox( names );
        inputFormPanel.addComponent( options, 3, 0, 1, 1 );

        // 送信ボタン
        JButton submit = new JButton( "送信" );
        submit.addActionListener( action );
        submit.setActionCommand( "CHECK_OUT" );
        inputFormPanel.addComponent( submit, 4, 0, 1, 1 );

        submit.addKeyListener( adapter );

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 2 ];
        context[ 0 ] = guid;
        context[ 1 ] = options;
        action.setContext( context );

    }

    public void setVisibleColomns( String selectedItemTypeName ) {}

}
::::::::::::::
ColWidthEntrencher.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* <pre>
* JTableのカラム幅を固定化する
* </pre>
*/

public class ColWidthEntrencher {

    static public void entrench( JTable table, int columnIndex, int width ) {

        TableColumn col = table.getColumnModel().getColumn( columnIndex );
        col.setMinWidth( width );
        col.setMaxWidth( width );

    }

}
::::::::::::::
DisposalAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class DisposalAction extends BaseUpdationAction {
    private final String STATUS = "DISPOSED";

    public DisposalAction() {
        super();
    }

    public void doAction() throws Exception {
        JTextField guid = ( JTextField ) context[ 0 ];
        JComboBox options = ( JComboBox ) context[ 1 ];
        Object reason = options.getSelectedItem();

        if ( guid.getText().length() == 0 ) {
            throw new Exception( "GUIDが入力されていません!" );
        }

        System.out.println( "GUID=" + guid.getText() );
        System.out.println( "index=" + options.getSelectedIndex() );
        System.out.println( "reason=" + reason );

        // 選択されたアイテムの属性を更新(この情報は、パネルが持っている)
        java.util.List sourceStatusList = panel.getSourceStatusList();
        try {
            // アイテムのステータスを更新する
            ItemStatusUpdater.update( guid.getText(), sourceStatusList, STATUS , panel.getLoginName() );

            // 修理業者の情報をセットする
            ItemManager manager = ItemManager.getInstance();
            Integer iGuid = new Integer( guid.getText() );
            Item item = manager.getItemByGUID( iGuid );
            item.updateAttribute( "REASON_FOR_DISPOSAL", reason );

            // 状態遷移履歴を格納
            ItemHistory history = ItemHistory.getInstance();
            history.insertLog( item );

        } catch ( Exception e ) {
            // System.err.println( e.toString() );
            e.printStackTrace();
        }

        // GUIDの入力フィールドをクリア
        guid.setText( "" );
    }
}

::::::::::::::
DisposalPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class DisposalPanel extends BaseUpdationPanel {

    private JComboBox options;

    public DisposalPanel() {
        super( new String[] {"UNAVAILABLE"}, new DisposalAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {
        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        // ラベル
        inputFormPanel.addComponent( new JLabel( "廃棄理由" ), 2, 0, 1, 1 );

        AttributeManager amgr = AttributeManager.getInstance();
        Attribute reason4disposal = amgr.getAttributeByName( "REASON_FOR_DISPOSAL" );
        java.util.List list = null;
        try {
            list = reason4disposal.getEnumList();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
        Object[] names = new Object[ list.size() ];
        for ( int i = 0;i < list.size();i++ ) {
            names[ i ] = list.get( i );
        }
        options = new JComboBox( names );
        inputFormPanel.addComponent( options, 3, 0, 1, 1 );

        // 送信ボタン
        JButton submit = new JButton( "送信" );
        submit.addActionListener( action );
        submit.setActionCommand( "CHECK_OUT" );
        inputFormPanel.addComponent( submit, 4, 0, 1, 1 );

        submit.addKeyListener( adapter );

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 2 ];
        context[ 0 ] = guid;
        context[ 1 ] = options;
        action.setContext( context );
    }

    public void setVisibleColomns( String selectedItemTypeName ) {}

}
::::::::::::::
Executable.java
::::::::::::::
/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public interface Executable {

    public void execute() throws Exception;

}
::::::::::::::
ImportedItemCreationPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.filechooser.*;

import java.io.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* ファイルチューザを使ってアイテムをインポート
*/

public class ImportedItemCreationPanel extends TSCommonPanel implements ActionListener {

    private JButton choose;
    private JTextArea area;
    private JButton submit;

    public ImportedItemCreationPanel() {
        super();

        // ファイル選択ボタン
        choose = new JButton( "ファイル選択" );
        addComponent( choose, 0, 0, 1, 1 );
        choose.addActionListener( this );
        choose.setActionCommand( "OPEN" );

        // 内容を確認するテキストフィールド
        area = new JTextArea( 10, 30 ); //10行30列のテキスト表示用テキストエリア
        //スクロールペインを作成して、テキストエリアをセットする
        JScrollPane areaScrollPane = new JScrollPane( area );
        addComponent( areaScrollPane, 0, 1, 2, 1 );

        // 登録を実行するボタン
        submit = new JButton( "登録" );
        addComponent( submit, 0, 2, 1, 1 );
        submit.addActionListener( this );
        submit.setActionCommand( "SUBMIT" );
    }

    private class TargetFileFilter extends javax.swing.filechooser.FileFilter {
        // java.io.FileFilterと名前が衝突するので注意!

        public boolean accept( java.io.File f ) {
            // ディレクトリなら表示
            if ( f.isDirectory() ) {
                return true;
            }
            // ファイルなら拡張子がtxtのものだけを表示
            String fileName = f.getName();
            int extIndex = fileName.lastIndexOf( "." );
            if ( extIndex >= 0 ) {
                if ( fileName.substring( extIndex ).equals( ".txt" ) ) {
                    return true;
                }
            }
            return false;
        }

        public String getDescription() {
            return "テキストファイル(*.txt)";
        }

    }

    public void actionPerformed( ActionEvent event ) {

        String command = event.getActionCommand();
        System.out.println( "COMAND: " + command );

        JFileChooser fileChooser = new JFileChooser( "../TXT" );

        fileChooser.addChoosableFileFilter( new TargetFileFilter() );

        /** ファイルを開く */
        if ( "OPEN".equals( command ) ) {
            if ( fileChooser.showOpenDialog( this ) == JFileChooser.APPROVE_OPTION ) {
                JOptionPane.showMessageDialog(
                    this,
                    fileChooser.getSelectedFile().getPath(),
                    "選択されたファイルのパス",
                    JOptionPane.INFORMATION_MESSAGE );

                File file = new File( fileChooser.getSelectedFile().getPath() );
                StringBuffer sb = new StringBuffer();
                try {
                    BufferedReader br = new BufferedReader( new FileReader( file ) );

                    String line = null;
                    while ( ( line = br.readLine() ) != null ) {
                        sb.append( line + "\n" );
                    }
                    br.close();
                } catch ( Exception e ) {
                    e.printStackTrace();
                }

                area.setText( sb.toString() );
            } else {
                JOptionPane.showMessageDialog( this, "ファイルが選択されていません!",
                                               "WARNING", JOptionPane.WARNING_MESSAGE );
            }

        }


    }


}
::::::::::::::
InputFormPanel.java
::::::::::::::
/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class InputFormPanel extends TSCommonPanel {
    public InputFormPanel() {
        super();
    }
}
::::::::::::::
InspectionAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class InspectionAction extends BaseUpdationAction {

    public InspectionAction() {
        super();
    }

    public void doAction() throws Exception {

        JTextField guid = ( JTextField ) context[ 0 ];
        ButtonGroup bGroup = ( ButtonGroup ) context[ 1 ];
        Map optionMap = ( Map ) context[ 2 ];

        // どのラジオボタンが選択されているかを判別する
        String status = null;
        Enumeration enumeration = bGroup.getElements();
        while ( enumeration.hasMoreElements() ) {
            JRadioButton radioButton = ( JRadioButton ) enumeration.nextElement();

            if ( radioButton.isSelected() ) {
                System.out.println( radioButton.getText() + " が選択されています" );
                status = ( String ) optionMap.get( radioButton.getText() );
            }
        }

        // 必須入力のチェック
        if ( guid.getText().length() == 0 ) {
            String message = "GUIDが入力されていません!";
            panel.setStatusMessage( message );
            throw new Exception( message );
        }

        System.out.println( "GUID=" + guid.getText() );
        System.out.println( "status=" + status );

        // 選択されたアイテムの属性を更新(この情報は、パネルが持っている)
        java.util.List sourceStatusList = panel.getSourceStatusList();
        try {
            ItemStatusUpdater.update( guid.getText(), sourceStatusList, status, panel.getLoginName() );

            ItemManager manager = ItemManager.getInstance();
            Integer iGuid = new Integer( guid.getText() );
            Item item = manager.getItemByGUID( iGuid );

            // 状態遷移履歴を格納
            ItemHistory history = ItemHistory.getInstance();
            history.insertLog( item );

        } catch ( Exception e ) {
            System.err.println( e.toString() );
            String message = e.toString();
            panel.setStatusMessage( message );
            throw new Exception( message );
        }

        // GUIDの入力フィールドをクリア
        guid.setText( "" );
        panel.setStatusMessage( "" );

    }
}
::::::::::::::
InspectionBeforeCheckOutPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class InspectionBeforeCheckOutPanel extends BaseUpdationPanel {

    private JComboBox options;

    public InspectionBeforeCheckOutPanel() {
        super( new String[] {"CHECK_IN"}, new InspectionAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {
        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        // ラジオボタン
        Map optionMap = new LinkedHashMap();
        optionMap.put( "利用可能",
                       "AVAILABLE_BEFORE_CHECK_OUT");
                       optionMap.put("修理必要",
                       "NEEDS_REPAIRMENT");
                       optionMap.put("利用不可能",
                       "UNAVAILABLE");

        ButtonGroup group = new ButtonGroup();
        JPanel radioPanel = new JPanel();
        radioPanel.setLayout( new BoxLayout( radioPanel, BoxLayout.X_AXIS ) );

        Iterator iterator = optionMap.keySet().iterator();
        int i=0;
        while(iterator.hasNext()){
            String key = (String)iterator.next();

            JRadioButton radioButton = new JRadioButton( key );
            if( i==0) {
                radioButton.setSelected(true);
            }

            group.add( radioButton);
            radioPanel.add(radioButton);
        }

        inputFormPanel.addComponent(radioPanel, 2,0,1,1);

        // 送信ボタン
        JButton submit = new JButton("送信");
        submit.addActionListener(action);
        submit.setActionCommand("INSPECTION");
        inputFormPanel.addComponent(submit, 3,0,1,1);

        submit.addKeyListener(adapter);

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 3 ];
        context[ 0 ] = guid;
        context[ 1 ] = group;
        context[ 2 ] = optionMap;
        action.setContext( context );

    }

    public void setVisibleColomns(String selectedItemTypeName){

    }
}

::::::::::::::
InspectionPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class InspectionPanel extends BaseUpdationPanel {

    private JComboBox options;

    public InspectionPanel() {
        super( new String[] {"CREATED", "REPAIRED", "CHECK_OUT"}, new InspectionAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {
        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        // ラジオボタン
        Map optionMap = new LinkedHashMap();
        optionMap.put( "利用可能", "AVAILABLE");
                       optionMap.put("修理必要", "NEEDS_REPAIRMENT");
                       optionMap.put("利用不可能", "UNAVAILABLE");

        ButtonGroup group = new ButtonGroup();
        JPanel radioPanel = new JPanel();
        radioPanel.setLayout( new BoxLayout( radioPanel, BoxLayout.X_AXIS ) );

        Iterator iterator = optionMap.keySet().iterator();
        int i=0;
        while(iterator.hasNext()){
            String key = (String)iterator.next();

            JRadioButton radioButton = new JRadioButton( key );
            if( i==0) {
                radioButton.setSelected(true);
            }

            group.add( radioButton);
            radioPanel.add(radioButton);
        }

        inputFormPanel.addComponent(radioPanel, 2,0,1,1);

        // 送信ボタン
        JButton submit = new JButton("送信");
        submit.addActionListener(action);
        submit.setActionCommand("INSPECTION");
        inputFormPanel.addComponent(submit, 3,0,1,1);

        submit.addKeyListener(adapter);

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 3 ];
        context[ 0 ] = guid;
        context[ 1 ] = group;
        context[ 2 ] = optionMap;
        action.setContext( context );

    }

    public void setVisibleColomns(String selectedItemTypeName){
        System.out.println( this.getClass().getName() + ": " + selectedItemTypeName + " が選択されました。");

        // アイテムタイプから属性の名称を取得する
        ItemManager manager = ItemManager.getInstance();
        ItemType it = manager.getItemTypeByName( selectedItemTypeName );
        java.util.List attributes = it.getAttributes();
        Object[] columnNames = new Object[ attributes.size() ];
        for ( int i = 0;i < attributes.size();i++ ) {
            Attribute attr = ( Attribute ) attributes.get( i );
            if("REASON_FOR_DISPOSAL".equals(attr.getName())){
                // サイズが0なので結局表示されない
                ColWidthEntrencher.entrench( table, i, 0);
            }
            if("CREATED_DATE".equals(attr.getName()) || "LAST_UPDATED_DATE".equals(attr.getName())){
                ColWidthEntrencher.entrench( table, i, 120);
            }
        }

    }
}

::::::::::::::
Item.java
::::::::::::::
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class Item {
    /**
    * システム内でユニークな連番
    */
    private static int GUID = 0;

    private ItemType itemType;
    private Map attributeMap;

    /**
    * @param itemType アイテムタイプ
    */
    public Item( ItemType itemType ) {

        this.itemType = itemType;

        attributeMap = new LinkedHashMap();

        init();
    }

    /**
    * アイテムのアイテムタイプを取得する
    */
    public ItemType getItemType() {
        return itemType;
    }

    private synchronized void init() {

        // アイテムタイプから引き継いだ属性をセット
        List list = itemType.getAttributes();
        for ( int i = 0;i < list.size();i++ ) {
            Attribute attr = ( Attribute ) list.get( i );
            attributeMap.put( attr.getName(), null );
        }

        GUID++;
        attributeMap.put( "GUID", GUID );
        attributeMap.put( "CREATED_DATE", TSUtil.getCurrentDateTime() );
        attributeMap.put( "STATUS", "CREATED" );
    }

    /**
    * 属性のキーと値のMAPを取得する
    */
    public Map getAttributeMap() {
        return attributeMap;
    }

    /**
    * @param key 属性名
    * @param value 属性値
    */
    public void updateAttribute( String key, Object value ) throws Exception {
        if ( !attributeMap.containsKey( key ) ) {
            throw new Exception( "このアイテムにこのような属性: " + key + " は存在しません!" );
        }
        attributeMap.put( key, value );
    }

    /**
    * アイテムの属性値を求める
    */
    public Object getAttributeValue( String key ) {
        return attributeMap.get( key );
    }

    public static void main( String[] args ) throws Exception {
        ItemType it1 = new ItemType( "鶏肉" );
        Attribute attr = new Attribute( "BREEDER", AttributeType.ENUM, "養鶏場" );
        List enumList = new LinkedList();
        enumList.add( "本田養鶏場" );
        enumList.add( "山下養鶏場" );
        enumList.add( "木島養鶏場" );
        attr.setEnumList( enumList );
        it1.addAttribute( attr );

        Item item = new Item( it1 );

        item.updateAttribute( "STATUS", "出荷済" );

        Map map = item.getAttributeMap();
        Iterator iterator = map.keySet().iterator();
        while ( iterator.hasNext() ) {
            String key = ( String ) iterator.next();
            System.out.println( key + " : " + map.get( key ) );
        }

    }
}
::::::::::::::
ItemContainer.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class ItemContainer {

    private Map itemMap;

    public ItemContainer() {
        itemMap = new HashMap();
    }

    public synchronized void put( Item item ) {
        ItemType itemType = item.getItemType();
        List itemList = ( List ) itemMap.get( itemType );

        if ( itemList == null ) {
            itemList = new LinkedList();
        }

        itemList.add( item );
        itemMap.put( itemType, itemList );
    }

    public Map getItemMap() {
        return itemMap;
    }

    public List getItemTypes() {
        List list = new LinkedList();
        Iterator iterator = itemMap.keySet().iterator();
        while ( iterator.hasNext() ) {
            list.add( iterator.next() );
        }

        return list;
    }

    public List getItemList( ItemType itemType ) {
        return ( List ) itemMap.get( itemType );
    }
}
::::::::::::::
ItemCreationAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class ItemCreationAction extends AbstractAction {

    /** ボタンを押したときの状況を取得するための参照 */
    private Object[] context;

    /** アイテムタイプと数量以外の情報 */
    private Map updateInfo = null;

    private java.util.List componentList;

    private ItemCreationPanel panel;

    public void setPanel( ItemCreationPanel panel ) {
        this.panel = panel;
    }

    public void actionPerformed( ActionEvent event ) {
        String command = event.getActionCommand();
        System.out.println( "command=" + command );

        //=================================================================
        // コンテキストの参照
        //=================================================================
        JComboBox itemTypeNames = ( JComboBox ) context[ 0 ];
        ItemType[] itemTypes = ( ItemType[] ) context[ 1 ];
        JComboBox qty = ( JComboBox ) context[ 2 ];
        componentList = ( java.util.List ) context[ 3 ];

        // コンポーネント(アイテムタイプと数量以外)からセットされている内容を読み取る
        getUpdateInfo();

        // ダンプ
        System.out.println( itemTypeNames.getSelectedItem() );
        System.out.println( itemTypeNames.getSelectedIndex() );
        System.out.println( qty.getSelectedItem() );

        // インデックスから対象アイテムタイプを取得する
        ItemType targetItemType = itemTypes[ itemTypeNames.getSelectedIndex() ];
        System.out.println( targetItemType.getName() );

        //------------------------------------------------
        // アイテムの登録
        //------------------------------------------------
        int count = new Integer( qty.getSelectedItem().toString() ).intValue();
        ItemManager manager = ItemManager.getInstance();

        // 指定した個数分アイテムを作成
        for ( int i = 0;i < count;i++ ) {
            Item item = new Item( targetItemType );
            System.out.println( "GUID=" + item.getAttributeValue( "GUID" ) );

            // 付加属性に対しての値をセット
            Iterator iterator = updateInfo.keySet().iterator();
            while ( iterator.hasNext() ) {

                String attrName = ( String ) iterator.next();
                Object value = updateInfo.get( attrName );
                try {
                    item.updateAttribute( attrName, value );
                } catch ( Exception e ) {
                    System.err.println( e.toString() );
                }
            }

            try {
                // ログイン名をセット
                item.updateAttribute( "OPERATOR", panel.getLoginName() );
            } catch ( Exception e ) {
                System.err.println( e.toString() );
            }

            // ItemManagerにItemを登録する
            manager.putItem( item );
        }

        // 更新をされたことを通知する
        manager.castUpdateMessage();

    }

    public ItemCreationAction() {
        super();
    }

    public void setContext( Object[] context ) {
        this.context = context;
    }

    private void getUpdateInfo() {
        updateInfo = new HashMap();

        Iterator iterator = componentList.iterator();
        while ( iterator.hasNext() ) {

            AttributeComponent ac = ( AttributeComponent ) iterator.next();
            Attribute attribute = ac.getAttribute();
            String attrName = attribute.getName();

            JComponent component = ac.getComponent();
            Object value = null;
            if ( component instanceof JComboBox ) {
                value = ( ( JComboBox ) component ).getSelectedItem();
            }
            if ( component instanceof JTextField ) {
                value = ( ( JTextField ) component ).getText();
            }

            System.out.println( attrName );
            System.out.println( value );

            updateInfo.put( attrName, value );

        }

    }
}

::::::::::::::
ItemCreationPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class ItemCreationPanel extends TSCommonPanel implements ActionListener {

    private java.util.List componentList = null;
    /** 送信ボタン */
    private JButton submit = null;

    /** 利用可能なアイテムタイプ*/
    private ItemType[] itemTypes;

    private JComboBox qty;
    private JComboBox itemTypeNames = null;

    public ItemCreationPanel() {
        super();

        // アイテムタイプ
        addComponent( new JLabel( "アイテムタイプ" ), 0, 0, 1, 1 );

        // 利用可能なアイテムタイプを取得する
        ItemManager manager = ItemManager.getInstance();
        java.util.List list = manager.getAvailableItemTypes();
        String[] names = new String[ list.size() ];
        itemTypes = new ItemType[ list.size() ];
        for ( int i = 0;i < list.size();i++ ) {
            ItemType it = ( ItemType ) list.get( i );
            names[ i ] = it.getName();
            itemTypes[ i ] = it;
        }

        itemTypeNames = new JComboBox( names );
        addComponent( itemTypeNames, 1, 0, 1, 1 );
        itemTypeNames.addActionListener( this );

        // 数量
        addComponent( new JLabel( "数量" ), 0, 1, 1, 1 );

        String[] values = new String[ 10 ];
        for ( int i = 0;i < 10;i++ ) {
            values[ i ] = String.valueOf( i + 1 );
        }
        qty = new JComboBox( values );
        addComponent( qty, 1, 1, 1, 1 );

        // それ以外の入力項目=アイテムタイプに依存する
        addComponentsForInputParameters();
    }

    public void actionPerformed( ActionEvent e ) {
        JComboBox cb = ( JComboBox ) e.getSource();
        String newSelection = ( String ) cb.getSelectedItem();

        System.out.println( newSelection + " が選択されました" );
        clearComponents();

        addComponentsForInputParameters();

        validate();
        repaint();
    }

    /**
    * コンポーネントをクリアする
    */
    private void clearComponents() {

        for ( int i = 0;i < componentList.size();i++ ) {
            AttributeComponent ac = ( AttributeComponent ) componentList.get( i );
            JLabel label = ac.getLabel();
            JComponent component = ac.getComponent();

            this.remove( label );
            this.remove( component );
        }

        this.remove( submit );
        validate();
        repaint();

    }

    /**
    * 属性に対しての入力UI
    */
    private void addComponentsForInputParameters() {

        // 現在選択されているアイテムタイプ
        System.out.println( "in " + this.getClass().getName() + ": " + itemTypeNames.getSelectedItem() );

        if ( componentList != null ) {
            componentList = null;
        }

        componentList = new LinkedList();

        try {

            AttributeManager amgr = AttributeManager.getInstance();
            // アイテムタイプに応じて入力可能な属性を変える
            if ( itemTypeNames.getSelectedIndex() == 0 ) {
                Attribute vendor = amgr.getAttributeByName( "VENDOR" );
                componentList.add( new AttributeComponent( "仕入先", vendor ) );

                Attribute availableCount = amgr.getAttributeByName( "AVAILABLE_COUNT" );
                componentList.add( new AttributeComponent( "最大利用可能回数", availableCount ) );
            }
            if ( itemTypeNames.getSelectedIndex() == 1 ) {
                Attribute vendor = amgr.getAttributeByName( "VENDOR" );
                componentList.add( new AttributeComponent( "仕入先", vendor ) );
            }
            if ( itemTypeNames.getSelectedIndex() == 2 ) {
                Attribute vendor = amgr.getAttributeByName( "VENDOR" );
                componentList.add( new AttributeComponent( "仕入先", vendor ) );
            }

        } catch ( Exception e ) {
            e.printStackTrace();
        }

        // アイテムタイプに応じたコンポーネントの表示
        int rownum = 2;
        Iterator iterator = componentList.iterator();
        while ( iterator.hasNext() ) {
            AttributeComponent ac = ( AttributeComponent ) iterator.next();
            JLabel label = ac.getLabel();
            JComponent component = ac.getComponent();
            addComponent( label, 0, rownum, 1, 1 );
            addComponent( component, 1, rownum, 1, 1 );

            rownum ++;
        }

        // 送信ボタン
        submit = new JButton( "送信" );
        addComponent( submit, 0, rownum, 2, 1 );

        ItemCreationAction action = new ItemCreationAction();
        submit.addActionListener( action );
        action.setPanel( this );

        // コンテキストの参照を引き渡す
        Object[] context = new Object[ 4 ];
        context[ 0 ] = itemTypeNames;
        context[ 1 ] = itemTypes;
        context[ 2 ] = qty;
        context[ 3 ] = componentList;
        action.setContext( context );

    }
}
::::::::::::::
ItemHistory.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class ItemHistory {
    /** アイテムの状態遷移を格納するリスト */
    private static List historyList = null;

    /** インスタンス */
    private static ItemHistory uniqueInstance = null;

    public static ItemHistory getInstance() {
        if ( uniqueInstance == null ) {
            uniqueInstance = new ItemHistory();

            System.out.println( uniqueInstance.getClass().getName() + " がインスタンス化されました。" );

            historyList = new LinkedList();
        }

        return uniqueInstance;
    }

    public static List getHistoryList() {
        return historyList;
    }

    /** その時点でのアイテムの属性に対する値を格納する */
    public static void insertLog( Item item ) {
        Map map = ( Map ) item.getAttributeMap();

        // 参照を引き渡さずに実体をコピーする(重要)
        historyList.add( ( ( LinkedHashMap ) map ).clone() );
        System.out.println( "historyListのサイズ=" + historyList.size() );

    }

    /** 指定したアイテムの状態遷移履歴をダンプする */
    public static void dumpList( Integer guid ) {

        for ( int i = 0;i < historyList.size();i++ ) {
            Map map = ( Map ) historyList.get( i );
            Integer iGuid = ( Integer ) map.get( "GUID" );

            if ( iGuid.equals( guid ) ) {
                System.out.println( "*** found ***" );

                Iterator iterator = map.keySet().iterator();
                while ( iterator.hasNext() ) {
                    String attrName = ( String ) iterator.next();
                    Object value = map.get( attrName );

                    System.out.print( "\t" + attrName + ": " + value );
                }

                System.out.println();

            }
        }
    }

    /** 指定したアイテムの履歴を新しい順に取り出す
    * @param guid 個体識別番号
    * @param attributes 取り出す属性
    * @return 行データのリスト
    */
    public java.util.List getRowDataList( Integer guid, Object[] attributes ) {

        java.util.List rowDataList = new LinkedList();

        // 履歴が新しい順に出力する
        for ( int i = historyList.size() - 1;i >= 0 ;i-- ) {
            Map map = ( Map ) historyList.get( i );
            Integer iGuid = ( Integer ) map.get( "GUID" );

            if ( iGuid.equals( guid ) ) {

                // 指定した属性の数だけカラムを生成する
                Object[] rowData = new Object[ attributes.length ];

                Iterator iterator = map.keySet().iterator();
                while ( iterator.hasNext() ) {
                    String attrName = ( String ) iterator.next();

                    for ( int j = 0;j < attributes.length;j++ ) {
                        if ( attrName.equals( attributes[ j ] ) ) {
                            rowData[ j ] = map.get( attrName );
                        }
                    }
                }

                rowDataList.add( rowData );
            }
        }

        return rowDataList;

    }
}
::::::::::::::
ItemManager.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* アイテムの現在の状態を管理するクラス
* シングルトンにしなければならない
*/

public class ItemManager extends Observable {

    private static ItemManager uniqueInstance = null;

    /** システムで取り扱い可能なアイテムタイプ(=登録できるもの)*/
    private static List availableItemTypes = null;

    private static ItemContainer itemContainer;

    /**
     * アイテムをGUIDから取得するためのIndex
     */
    private static Map guidIndex;

    /**
    * コンストラクタ
    */
    private ItemManager() {
        itemContainer = new ItemContainer();
        guidIndex = new LinkedHashMap();

        try {
            // 利用可能なアイテムタイプを設定する
            configureAvailableItemTypes();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }

    public static ItemManager getInstance() {
        if ( uniqueInstance == null ) {
            uniqueInstance = new ItemManager();
            System.out.println( uniqueInstance.getClass().getName() + " がインスタンス化されました。" );
        }

        return uniqueInstance;
    }

    /**
    * アイテムの更新をObserver(=TrackingSimulationクラスに伝える)
    * イベント発生もとのオブジェクト
    */
    public void castUpdateMessage() {
        setChanged();
        notifyObservers( null );
    }


    /** システムで取り扱い可能なアイテムタイプを求める*/
    public List getAvailableItemTypes() {
        return availableItemTypes;
    }

    public ItemType getItemTypeByName( String name ) {
        Iterator iterator = availableItemTypes.iterator();
        while ( iterator.hasNext() ) {
            ItemType it = ( ItemType ) iterator.next();
            if ( name.equals( it.getName() ) ) {
                return it;
            }
        }

        return null;
    }

    /**
    * 利用可能なアイテムタイプを設定する→あとで別クラスに委譲するように変更予定
    * XMLから設定を読み込むようにする
    */
    private void configureAvailableItemTypes() throws Exception {

        AttributeManager amgr = AttributeManager.getInstance();

        // 属性: 倉庫
        Attribute warehouse = new Attribute( "WAREHOUSE", AttributeType.TABLE_MAPPED, "倉庫" );
        warehouse.setTableName( "Warehouse" );
        amgr.putNameMap( warehouse );

        // 属性: 製造ライン
        Attribute assemblyLine = new Attribute( "ASSEMBLY_LINE", AttributeType.TABLE_MAPPED, "製造ライン" );
        warehouse.setTableName( "AssemblyLine" );
        amgr.putNameMap( assemblyLine );

        // 属性: 修理業者
        Attribute repairer = new Attribute( "REPAIRER", AttributeType.TABLE_MAPPED, "修理業者" );
        repairer.setTableName( "Repairer" );
        amgr.putNameMap( repairer );

        // 属性: 廃棄理由
        Attribute reason4disposal = new Attribute( "REASON_FOR_DISPOSAL", AttributeType.ENUM, "廃棄理由" );
        List enumList = new LinkedList();
        enumList.add( "破損" );
        enumList.add( "その他" );
        reason4disposal.setEnumList( enumList );
        amgr.putNameMap( reason4disposal );

        // 属性: 仕入先を設定
        Attribute vendor = new Attribute( "VENDOR", AttributeType.ENUM, "仕入先" );
        vendor.addEnumValue( "岡本商店" );
        vendor.addEnumValue( "藤村工具店" );
        vendor.addEnumValue( "ツールの板尾" );
        vendor.addEnumValue( "窪寺商事" );
        vendor.addEnumValue( "その他" );
        amgr.putNameMap( vendor );

        // 属性: 利用可能回数を設定
        Attribute availableCount = new Attribute( "AVAILABLE_COUNT", AttributeType.ENUM, "利用可能回数" );
        for ( int i = 10;i <= 50;i += 10 ) {
            availableCount.addEnumValue( new Integer( i ) );
        }
        amgr.putNameMap( availableCount );

        // 属性: 利用回数を設定
        Attribute useCount = new Attribute( "USE_COUNT", AttributeType.NORMAL, "利用回数" );

        //-------------------------------------------------------------
        // システムで取り扱い対象となるアイテムタイプを設定する
        //-------------------------------------------------------------
        availableItemTypes = new LinkedList();

        ItemType cutter = new ItemType( "カッター" );
        cutter.addAttribute( warehouse );
        cutter.addAttribute( assemblyLine );
        cutter.addAttribute( repairer );
        cutter.addAttribute( reason4disposal );
        cutter.addAttribute( vendor );
        cutter.addAttribute( availableCount );
        cutter.addAttribute( useCount );
        availableItemTypes.add( cutter );

        ItemType pench = new ItemType( "ペンチ" );
        pench.addAttribute( warehouse );
        pench.addAttribute( assemblyLine );
        pench.addAttribute( repairer );
        pench.addAttribute( vendor );
        pench.addAttribute( reason4disposal );
        availableItemTypes.add( pench );

        ItemType spanner = new ItemType( "スパナ" );
        spanner.addAttribute( assemblyLine );
        spanner.addAttribute( warehouse );
        spanner.addAttribute( repairer );
        spanner.addAttribute( vendor );
        spanner.addAttribute( reason4disposal );
        availableItemTypes.add( spanner );

    }

    /** 登録されているアイテムからアイテムタイプのリストを求める */
    public List getItemTypes() {
        List itemTypes = itemContainer.getItemTypes();

        return itemTypes;
    }

    /**
    * 指定したアイテムタイプに属するアイテムのリストを得る
    */
    public List getItemList( ItemType itemType ) {

        return itemContainer.getItemList( itemType );
    }

    /**
    * 登録されている全てのアイテムを求める
    */
    public Map getItemMap() {

        return itemContainer.getItemMap();
    }

    /**
    * アイテムを格納する
    * @param item アイテム
    */
    public synchronized void putItem( Item item ) {
        itemContainer.put( item );

        Integer GUID = ( Integer ) item.getAttributeValue( "GUID" );
        guidIndex.put( GUID, item );

        // 状態遷移履歴を格納
        ItemHistory history = ItemHistory.getInstance();
        history.insertLog( item );
    }

    /**
    * GUIDインデックスを取得する
    */
    public Map getGUIDIndex() {
        return guidIndex;
    }

    /**
    * GUIDを指定してアイテムを取得する
    */
    public Item getItemByGUID( int guid ) {
        return ( Item ) guidIndex.get( guid );
    }

    public static void main( String[] args ) throws Exception {

        ItemManager manager = ItemManager.getInstance();

        ItemType chicken = new ItemType( "鶏肉" );
        Attribute attr = new Attribute( "BREEDER", AttributeType.ENUM, "養鶏場" );
        List enumList = new LinkedList();
        enumList.add( "本田養鶏場" );
        enumList.add( "山下養鶏場" );
        enumList.add( "木島養鶏場" );
        attr.setEnumList( enumList );
        chicken.addAttribute( attr );

        Item item1 = new Item( chicken );
        manager.putItem( item1 );
        Item item2 = new Item( chicken );
        manager.putItem( item2 );

        List itemTypes = manager.getItemTypes();
        for ( int i = 0;i < itemTypes.size();i++ ) {
            ItemType itemType = ( ItemType ) itemTypes.get( i );

            System.out.println( "アイテムタイプ名称: " + itemType.getName() );

            List itemList = manager.getItemList( itemType );
            for ( int j = 0;j < itemList.size();j++ ) {
                Item eachItem = ( Item ) itemList.get( j );
                Map attrMap = eachItem.getAttributeMap();
                Iterator iterator = attrMap.keySet().iterator();
                while ( iterator.hasNext() ) {
                    String key = ( String ) iterator.next();
                    System.out.println( key + " : " + attrMap.get( key ) );
                }

                System.out.println();
            }
        }

        // GUID=1を指定してアイテムを取得する
        Item item3 = manager.getItemByGUID( 1 );
        Map attrMap = item3.getAttributeMap();
        Iterator iterator = attrMap.keySet().iterator();
        while ( iterator.hasNext() ) {
            String key = ( String ) iterator.next();
            System.out.println( key + " : " + attrMap.get( key ) );
        }

    }
}
::::::::::::::
ItemQueryPanel.java
::::::::::::::
import java.awt.*;

import javax.swing.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class ItemQueryPanel extends JPanel {

    private JPanel centerPanel;
    private JPanel bottomPanel;

    public JPanel getCenterPanel() {
        return centerPanel;
    }
    public JPanel getBottomPanel() {
        return bottomPanel;
    }

    public ItemQueryPanel() {

        // 上部に表示するメニューバー
        MyMenuBar menuBar = new MyMenuBar();
        // 親画面の参照を引き渡しておく
        menuBar.setParentObject( this );
        // JMenuの追加
        menuBar.addJMenu();

        // 中心に配置するパネル
        centerPanel = new JPanel();

        // 下部に配置するパネル
        bottomPanel = new JPanel();
        bottomPanel.setBackground( Color.cyan );

        //-----------------------------------------------------
        // 全ての部品をContainerに配置する
        //-----------------------------------------------------
        this.setLayout( new BorderLayout() );

        this.add( menuBar, BorderLayout.NORTH );
        this.add( centerPanel, BorderLayout.CENTER );
        this.add( bottomPanel, BorderLayout.SOUTH );

    }

    public void dumpAll() {
        // 現在の全アイテムをダンプ
        ItemManager manager = ItemManager.getInstance();
        Map map = manager.getGUIDIndex();
        Iterator iterator = map.keySet().iterator();

        while ( iterator.hasNext() ) {
            Integer guid = ( Integer ) iterator.next();
            Item item = ( Item ) map.get( guid );
            // アイテムが持つ全ての属性をダンプする
            dumpAllAttributes( item );
        }

        ItemHistory history = ItemHistory.getInstance();
        // とりあえず検証用
        history.dumpList( new Integer( 1 ) );
    }

    private void dumpAllAttributes( Item item ) {

        ItemType it = item.getItemType();
        System.out.print( it.getName() );

        Map map = ( Map ) item.getAttributeMap();
        Iterator iterator = map.keySet().iterator();
        while ( iterator.hasNext() ) {
            String attrName = ( String ) iterator.next();
            Object value = map.get( attrName );

            System.out.print( "\t" + attrName + ": " + value );
        }

        System.out.println();
    }
}
::::::::::::::
ItemStatusUpdater.java
::::::::::::::
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class ItemStatusUpdater {

    /** アイテムのステータスを更新する */
    static public synchronized void update( String guid, List sourceStatusList, String targetStatus, String loginName ) {

        ItemManager manager = ItemManager.getInstance();

        Item item = manager.getItemByGUID( new Integer( guid ) );
        if ( item == null ) {
            System.err.println( "対象アイテムが存在しません!" );
            return ;
        }

        System.out.println( "対象アイテムのアイテムタイプ: " + item.getItemType().getName() );

        String status = ( String ) item.getAttributeValue( "STATUS" );
        System.out.println( "現在のステータス=" + status );

        if ( !sourceStatusList.contains( status ) ) {
            System.err.println( "ステータスが対象外です!" );
            return ;
        }

        // アイテムのステータス更新
        try {

            item.updateAttribute( "STATUS", targetStatus );
            item.updateAttribute( "LAST_UPDATED_DATE", TSUtil.getCurrentDateTime() );
            item.updateAttribute( "OPERATOR", loginName );

        } catch ( Exception e ) {
            System.err.println( e.toString() );
        }
    }

}
::::::::::::::
ItemType.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class ItemType {
    /**
    * アイテムタイプの名称
    */
    private String name;

    /**
    * アイテムタイプが持つ属性
    */
    private List attributes;

    public ItemType( String name ) {
        this.name = name;

        // 予約済みの属性をセット
        attributes = new LinkedList();
        attributes.add( new Attribute( "GUID", AttributeType.NORMAL, "個体識別番号" ) );
        attributes.add( new Attribute( "STATUS", AttributeType.NORMAL , "ステータス" ) );
        attributes.add( new Attribute( "CREATED_DATE", AttributeType.NORMAL, "登録日時" ) );
        attributes.add( new Attribute( "LAST_UPDATED_DATE", AttributeType.NORMAL, "更新日時" ) );
        attributes.add( new Attribute( "OPERATOR", AttributeType.NORMAL, "オペレータ" ) );
    }

    /**
    * 属性を追加する
    */
    public void addAttribute( Attribute attribute ) {
        attributes.add( attribute );
    }

    public String getName() {
        return name;
    }

    public List getAttributes() {
        return attributes;
    }

    /**
    * 属性名からAttributeのオブジェクトを取得する
    */
    public Attribute getParticularAttribute( String attrName ) {
        for ( int i = 0;i < attributes.size();i++ ) {
            Attribute attribute = ( Attribute ) attributes.get( i );

            if ( ( attribute.getName() ).equals( attrName ) ) {
                return attribute;
            }
        }

        System.out.println( "属性:" + attrName + " がありません" ) ;
        return null;
    }

    public static void main( String[] args ) throws Exception {
        ItemType it1 = new ItemType( "鶏肉" );
        Attribute attr = new Attribute( "BREEDER", AttributeType.ENUM, "養鶏場" );
        List enumList = new LinkedList();
        enumList.add( "本田養鶏場" );
        enumList.add( "山下養鶏場" );
        enumList.add( "木島養鶏場" );
        attr.setEnumList( enumList );
        it1.addAttribute( attr );

        ItemType it2 = new ItemType( "牛肉" );
        ItemType it3 = new ItemType( "豚肉" );

        Iterator iterator = ( it1.getAttributes() ).iterator();
        while ( iterator.hasNext() ) {
            attr = ( Attribute ) iterator.next();
            System.out.println( attr.getName() + " : " + attr.getType() );
            if ( attr.getType() == AttributeType.ENUM ) {
                enumList = attr.getEnumList();
                for ( int i = 0;i < enumList.size();i++ ) {
                    System.out.println( "\t" + enumList.get( i ) );
                }
            }
        }

    }
}
::::::::::::::
MyChangeListener.java
::::::::::::::
import java.awt.*;

import javax.swing.*;
import javax.swing.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* TabbedPaneで別のメニューを選択したときのアクションを拾う
*/

public class MyChangeListener implements ChangeListener {

    public void stateChanged( ChangeEvent changeEvent ) {
        JTabbedPane sourceTabbedPane = ( JTabbedPane ) changeEvent.getSource();
        int index = sourceTabbedPane.getSelectedIndex();
        System.out.println( "Tab changed to: "
                            + sourceTabbedPane.getTitleAt( index ) );

        JComponent component = ( JComponent ) sourceTabbedPane.getComponentAt( index );
        if ( component instanceof BaseUpdationPanel ) {
            // 初期化メソッドの実行
            ( ( BaseUpdationPanel ) component ).reload();
        }
        if ( component instanceof ItemQueryPanel ) {
            ( ( ItemQueryPanel ) component ).dumpAll();
        }

        System.out.println( "component = " + component );
    }

}

::::::::::::::
MyKeyAdapter.java
::::::::::::::
import java.awt.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class MyKeyAdapter extends KeyAdapter {

    /** リターンキーが押されたときに実行するためのアクションクラス(参照)*/
    private BaseUpdationAction action;
    private BaseUpdationPanel panel;

    public MyKeyAdapter() {
        super();
    }

    public void setAction( BaseUpdationAction action ) {
        this.action = action;
    }
    public void setPanel( BaseUpdationPanel panel ) {
        this.panel = panel;
    }

    public void keyReleased( KeyEvent e ) {
        Object keyText = e.getKeyText( e.getKeyCode() );
        System.out.println( "Release: " + keyText );

        if ( "Enter".equals( keyText ) ) {
            System.out.println( "リターンキーが押下されました。" );
            try {
                action.doAction();
                panel.reload();
            } catch ( Exception exception ) {
                System.err.println( exception );
            }
        }
    }

}
::::::::::::::
MyMenuBar.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class MyMenuBar extends JMenuBar {

    /** 実際はItemQueryPanelがインスタンス化されたもの */
    private Object parentObject;

    public MyMenuBar() {
        super();
    }

    public void setParentObject( Object parentObject ) {
        this.parentObject = parentObject;
    }

    public void addJMenu() {

        JMenu onlineView = new JMenu( "オンラインビュー" );
        JMenu historyView = new JMenu( "ヒストリビュー" );

        MyMenuBarAction action = new MyMenuBarAction();
        action.setParentObject( parentObject );

        addMenuItem( onlineView, action, "ステータス別", "BY_STATUS" );

        JMenu etc = new JMenu( "その他機能" );
                               onlineView.add( etc );
                               addMenuItem( etc, action, "機能1", "first" );
                               addMenuItem( etc, action, "機能2", "sencond" );
                               addMenuItem( etc, action, "機能3", "third" );

                               addMenuItem( historyView, action, "function1", "A" );
                               addMenuItem( historyView, action, "function2", "B" );
                               addMenuItem( historyView, action, "function3", "C" );
                               addMenuItem( historyView, action, "function4", "D" );
                               addMenuItem( historyView, action, "function5", "E" );

                               this.add( onlineView );
                               this.add( historyView );

                           }

                               private void addMenuItem( JMenu menu, Action action, String description, String commandName ) {
                               JMenuItem item = new JMenuItem( description );
                               menu.add( item );
                               item.setActionCommand( commandName );
                               item.addActionListener( action );
                           }

                           }
::::::::::::::
MyMenuBarAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class MyMenuBarAction extends AbstractAction {
    private Object parentObject;

    public MyMenuBarAction() {
        super();
    }

    public void setParentObject( Object parentObject ) {
        this.parentObject = parentObject;
    }

    public void actionPerformed( ActionEvent event ) {
        String command = event.getActionCommand();

        System.out.println( "in " + this.getClass().getName() + ": " + command );

        JPanel centerPanel = ( ( ItemQueryPanel ) parentObject ).getCenterPanel();
        centerPanel.removeAll();

        if ( "BY_STATUS".equals( command ) ) {
            new QueryResultViewerByStatus( centerPanel );
        }

        centerPanel.validate();
        centerPanel.repaint();
    }
}

::::::::::::::
QueryResultRetriever.java
::::::::::::::
import javax.swing.*;
import javax.swing.table.*;

import java.util.*;

import java.awt.*;
import java.awt.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class QueryResultRetriever {

    /**
    * @param selectedStatus 選択されたステータス 
    * @return テーブルのモデル
    */
    public static DefaultTableModel retrieve( String selectedStatus ) {

        DefaultTableModel model = new DefaultTableModel();

        java.util.List columnNameList = new LinkedList();
        columnNameList.add( "個体識別番号" );
        columnNameList.add( "アイテム種別" );
        columnNameList.add( "ステータス" );
        columnNameList.add( "登録日時" );
        columnNameList.add( "更新日時" );
        columnNameList.add( "オペレータ" );

        //-------------------------------------------------------------
        // 選択されたステータスに応じて表示する属性を変える
        //-------------------------------------------------------------
        Map additionalColumnMap = getAdditionalColumns( selectedStatus );
        Iterator itrt = additionalColumnMap.keySet().iterator();
        while ( itrt.hasNext() ) {
            String attr = ( String ) itrt.next();
            columnNameList.add( additionalColumnMap.get( attr ) );
        }

        // テーブルのヘッダを決める
        Object[] columnNames = new Object[ columnNameList.size() ];
        for ( int i = 0;i < columnNames.length;i++ ) {
            columnNames[ i ] = columnNameList.get( i );
        }
        model.setColumnIdentifiers( columnNames );

        ItemManager manager = ItemManager.getInstance();
        Map map = manager.getGUIDIndex();
        Iterator iterator = map.keySet().iterator();

        while ( iterator.hasNext() ) {
            Integer guid = ( Integer ) iterator.next();
            Item item = ( Item ) map.get( guid );
            String status = ( String ) item.getAttributeValue( "STATUS" );
            Object createdDate = item.getAttributeValue( "CREATED_DATE" );
            Object lastUpdatedDate = item.getAttributeValue( "LAST_UPDATED_DATE" );
            Object operator = item.getAttributeValue( "OPERATOR" );
            ItemType itemType = item.getItemType();
            String itemTypeName = itemType.getName();

            Object[] rec = new Object[ columnNames.length ];
            rec[ 0 ] = guid;
            rec[ 1 ] = itemTypeName;
            rec[ 2 ] = status;
            rec[ 3 ] = createdDate;
            rec[ 4 ] = lastUpdatedDate;
            rec[ 5 ] = operator;

            //-------------------------------------------------------------
            // 選択されたステータスに応じて取得する属性名・値を変える
            //-------------------------------------------------------------
            Map acMap = getAdditionalColumns( selectedStatus );
            Iterator itrt2 = additionalColumnMap.keySet().iterator();
            int i = 1;
            while ( itrt2.hasNext() ) {
                String attr = ( String ) itrt2.next();
                rec[ 5 + i ] = item.getAttributeValue( attr );
                i++;
            }

            // 対象ステータスのレコードのみモデルに追加する
            if ( !status.equals( selectedStatus ) ) {
                continue;
            }

            model.addRow( rec );
        }

        return model;

    }

    static Map getAdditionalColumns( String selectedStatus ) {
        Map map = new LinkedHashMap();

        if ( "AVAILABLE".equals( selectedStatus ) ) {
            map.put( "VENDOR", "仕入先" );
            map.put( "ASSEMBLY_LINE", "製造ライン" );
            map.put( "REPAIRER", "修理業者" );
        }
        if ( "AVAILABLE_BEFORE_CHECK_OUT".equals( selectedStatus ) ) {
            map.put( "VENDOR", "仕入先" );
            map.put( "WAREHOUSE", "倉庫" );
        }
        if ( "UNAVAILABLE".equals( selectedStatus ) ) {
            map.put( "VENDOR", "仕入先" );
        }
        if ( "CREATED".equals( selectedStatus ) ) {
            map.put( "VENDOR", "仕入先" );
        }
        if ( "CHECK_IN".equals( selectedStatus ) ) {
            map.put( "WAREHOUSE", "倉庫" );
        }
        if ( "CHECK_OUT".equals( selectedStatus ) ) {
            map.put( "ASSEMBLY_LINE", "製造ライン" );
        }
        if ( "NEEDS_REPAIRMENT".equals( selectedStatus ) ) {
            map.put( "VENDOR", "仕入先" );
        }
        if ( "REPAIRED".equals( selectedStatus ) ) {
            map.put( "REPAIRER", "修理業者" );
        }
        if ( "DISPOSED".equals( selectedStatus ) ) {
            map.put( "REASON_FOR_DISPOSAL", "廃棄理由" );
        }

        return map;
    }

}
::::::::::::::
QueryResultRowChooser.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* <pre>
* テーブル内の特定の行を選択する
* </pre>
*/

public class QueryResultRowChooser extends MouseAdapter {
    public Object prevClickedGuid = null;
    public int clickCount = 0;

    public QueryResultRowChooser( ) {}

    public void mousePressed( MouseEvent e ) {
        JTable table = ( JTable ) e.getSource();
        int rowNum = table.getSelectedRow();

        //----------------------------------------------------------------------------------------------------------
        // TableSorterをモデルとしてセットしているので、スーパークラスのAbstractTableModelにキャストする必要がある
        //----------------------------------------------------------------------------------------------------------
        AbstractTableModel model = ( AbstractTableModel ) table.getModel();

        Object valueOfGuid = model.getValueAt( rowNum, 0 );

        if ( prevClickedGuid != null
                && prevClickedGuid == valueOfGuid
                && clickCount > 1 ) {
            // ダブルクリックされたかどうかを判断
            System.out.println( "/*** in " + this.getClass().getName() + " GUID=" + valueOfGuid );
            QueryResultViewerBySingleItem view = new QueryResultViewerBySingleItem( ( Integer ) valueOfGuid );

            clickCount = 0;
        }

        prevClickedGuid = valueOfGuid;

        clickCount++;

    }
}

::::::::::::::
QueryResultViewerBySingleItem.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* <pre>
* 個別のアイテム履歴を表示する
* </pre>
*/

public class QueryResultViewerBySingleItem extends JFrame
    implements Observer, ActionListener, ItemListener {

    /** 個体識別番号 */
    public Integer guid;

    /** アイテム履歴を表示するテーブル */
    protected JTable table;

    protected ItemType itemType;

    // チェックボックスを格納するパネル
    protected JPanel cbPanel;

    // 属性名の逆引きHashMap
    protected Map reverseAttrMap;

    /** ステータスを選択するためのコンボボックス*/
    private StatusFilterComboBox statusFilterComboBox;

    public QueryResultViewerBySingleItem( Integer guid ) {

        super( "■アイテム履歴" );
        setBounds( 400, 256, 720, 640 );

        this.guid = guid;
        reverseAttrMap = new HashMap();

        // アイテムからアイテム種別を取得する
        Item item = ItemManager.getInstance().getItemByGUID( guid );
        itemType = item.getItemType();
        String itemTypeName = itemType.getName();

        //---------------------------------------------------
        // 上部のパネル
        //---------------------------------------------------
        /** アイテムの情報を表示するパネル **/
        JPanel northPanel = new JPanel();
        northPanel.setLayout( new BorderLayout() );
        northPanel.setPreferredSize( new Dimension( 700, 150 ) );

        JPanel itemInfoPanel = new JPanel();
        JLabel guidLabel = new JLabel( "GUID:" );
        JLabel guidValue = new JLabel( guid.toString() );
        itemInfoPanel.add( guidLabel );
        itemInfoPanel.add( guidValue );

        itemInfoPanel.add( new JLabel( "    " ) );
        itemInfoPanel.add( new JLabel( "アイテム種別:" ) );
        itemInfoPanel.add( new JLabel( itemTypeName ) );

        northPanel.add( itemInfoPanel, BorderLayout.NORTH );

        /** チェックボックスを表示するパネル **/
        cbPanel = new JPanel();
        cbPanel.setLayout( new FlowLayout() );

        // このアイテムが保有する属性を取得する
        java.util.List attrList = itemType.getAttributes();
        for ( int i = 0;i < attrList.size();i++ ) {
            Attribute attr = ( Attribute ) attrList.get( i );
            String name = attr.getName();
            if ( name.equals( "GUID" ) ) {
                continue;
            }

            String displayName = attr.getDisplayName();
            JCheckBox cb = null;
            if ( name.equals( "STATUS" ) || name.equals( "CREATED_DATE" )
                    || name.equals( "LAST_UPDATED_DATE" ) || name.equals( "OPERATOR" ) ) {
                cb = new JCheckBox( displayName , true );
                // 変更不可にする
                cb.setEnabled( false );
            } else {
                cb = new JCheckBox( displayName, false );
            }

            // 属性名の逆引きマップを更新
            reverseAttrMap.put( displayName, name );

            cbPanel.add( cb );

            // actionListenerをチェックボックスに追加する
            cb.addActionListener( this );

        }
        northPanel.add( cbPanel, BorderLayout.CENTER );

        /** ステータスを選択するためのコンボボックスを表示するパネル **/
        JPanel statusFilterPanel = new JPanel();
        statusFilterComboBox = new StatusFilterComboBox();
        statusFilterComboBox.addItemListener( this );

        statusFilterPanel.add( new JLabel( "ステータス:" ) );
        statusFilterPanel.add( statusFilterComboBox );

        northPanel.add( statusFilterPanel, BorderLayout.SOUTH );

        //---------------------------------------------------
        // 中央のパネル
        //---------------------------------------------------
        // スクロールペイン
        table = new JTable();
        table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
        showHistory();
        JScrollPane scrPane = new JScrollPane();
        scrPane.getViewport().setView( table );
        scrPane.setPreferredSize( new Dimension( 700, 400 ) );

        JPanel centerPanel = new JPanel();
        centerPanel.add( scrPane );

        //---------------------------------------------------
        // 全体
        //---------------------------------------------------
        Container content = this.getContentPane();
        content.add( northPanel, BorderLayout.NORTH );
        content.add( centerPanel, BorderLayout.CENTER );

        setVisible( true );
        // pack();

        //==================================================================-
        // ItemManagerは抽象クラスObservableを継承したものになっている
        //==================================================================-
        ItemManager im = ItemManager.getInstance();
        im.addObserver( this );
    }

    public void update( Observable obj, Object arg ) {

        System.out.println( "in " + this.getClass().getName() + ": UPDATE()" );
        showHistory();

    }

    private void showHistory() {

        System.out.println( "in " + this.getClass().getName() + ": showHistory()" );
        System.out.println( "in " + this.getClass().getName() + ": " + statusFilterComboBox.getSelectedItem() );

        Map selectedAttrMap = new LinkedHashMap();
        Component[] checkBoxes = ( Component[] ) cbPanel.getComponents();
        for ( int i = 0;i < checkBoxes.length;i++ ) {
            String displayName = ( ( JCheckBox ) checkBoxes[ i ] ).getText();
            String attrName = ( String ) reverseAttrMap.get( displayName );
            boolean isEnabled = ( ( JCheckBox ) checkBoxes[ i ] ).isEnabled();
            boolean isSelected = ( ( JCheckBox ) checkBoxes[ i ] ).isSelected();

            // System.out.println( displayName + " : " + attrName + " : " + isEnabled + " : " + isSelected );
            if ( isSelected ) {
                selectedAttrMap.put( displayName, attrName );
            }
        }

        // 選択されている属性から値を取り出す
        Object[] attributes = new Object[ selectedAttrMap.size() ];
        Object[] columnNames = new Object[ selectedAttrMap.size() ];
        Iterator iterator = selectedAttrMap.keySet().iterator();
        int index = 0;
        while ( iterator.hasNext() ) {
            Object key = iterator.next();
            columnNames[ index ] = key;
            attributes[ index ] = selectedAttrMap.get( key );
            index++;
        }

        // 履歴を取り出す
        ItemHistory history = ItemHistory.getInstance();
        java.util.List rowDataList = history.getRowDataList( guid, attributes );

        System.out.println( "rowDataListのサイズ=" + rowDataList.size() );
        java.util.List selectedRowList = new LinkedList();

        Object selectedStatus = statusFilterComboBox.getSelectedItem();
        for ( int i = 0;i < rowDataList.size();i++ ) {
            Object[] row = ( Object[] ) rowDataList.get( i );
            // System.out.println( "カラム数=" + row.length );

            if ( !selectedStatus.equals( "全選択" ) ) {
                // 選択されているステータスが全選択でない場合は、対象ステータスの行のみ取り出す
                if ( !row[ 0 ].equals( selectedStatus ) ) {
                    continue;
                }
            }

            selectedRowList.add( row );

        }
        Object[][] rowArray = new Object[ selectedRowList.size() ][];
        for ( int i = 0;i < rowArray.length;i++ ) {
            rowArray[ i ] = ( Object[] ) selectedRowList.get( i );
        }

        // テーブルのモデルを生成
        DefaultTableModel model = new DefaultTableModel( rowArray, columnNames );

        TableSorter sorter = new TableSorter( model );
        table.setModel( sorter );
        sorter.setTableHeader( table.getTableHeader() );

        // 各カラムの表示幅を指定する
        int[] width = new int[ columnNames.length ];
        for ( int i = 0;i < width.length;i++ ) {
            TableColumn col = table.getColumnModel().getColumn( i );
            Object attrName = attributes[ i ];

            // 登録日付と更新日付だけは幅を固定する
            if ( attrName.equals( "CREATED_DATE" ) || attrName.equals( "LAST_UPDATED_DATE" ) ) {
                col.setMinWidth( 120 );
                col.setMaxWidth( 120 );
            }
            // ステータスの場合も幅を固定
            if ( attrName.equals( "STATUS" ) ) {
                col.setMinWidth( 150 );
                col.setMaxWidth( 150 );
            }
        }

        // 再描画
        this.validate();
        this.repaint();
    }

    public void actionPerformed( ActionEvent event ) {

        String command = event.getActionCommand();

        System.out.println( "ACTION PERFORMED *** " + command );

        showHistory();

    }

    /**
    * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
    */
    public void itemStateChanged( ItemEvent event ) {
        System.out.println( "in " + this.getClass().getName() + ": itemStateChange" );
        showHistory();
    }

    public static void main( String[] args ) {
        new QueryResultViewerBySingleItem( new Integer( 1 ) );
    }
}

::::::::::::::
QueryResultViewerByStatus.java
::::::::::::::
import javax.swing.*;
import javax.swing.table.*;

import java.util.*;

import java.awt.*;
import java.awt.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class QueryResultViewerByStatus {

    private JPanel panel;

    public QueryResultViewerByStatus( JPanel panel ) {

        this.panel = panel;

        panel.setLayout( new BorderLayout() );
        panel.add( new JLabel( "ステータス別アイテムリスト", JLabel.CENTER ), BorderLayout.NORTH );

        ResultViewer viewer = new ResultViewer();
        panel.add( viewer , BorderLayout.CENTER );

        //==================================================================-
        // ItemManagerは抽象クラスObservableを継承したものになっている
        //==================================================================-
        ItemManager im = ItemManager.getInstance();
        im.addObserver( viewer );
    }

    /**
    * 照会結果を表示するインナークラス
    */
    private class ResultViewer extends TSCommonPanel implements ActionListener, Observer {

        private JComboBox filterComboBox;

        /** アイテム一覧を表示するテーブル */
        private JTable table;

        public ResultViewer() {

            Object[] names = new Object[] {
                                 "AVAILABLE",
                                 "AVAILABLE_BEFORE_CHECK_OUT",
                                 "UNAVAILABLE",
                                 "CREATED",
                                 "CHECK_IN",
                                 "CHECK_OUT",
                                 "NEEDS_REPAIRMENT",
                                 "REPAIRED",
                                 "DISPOSED"
                             };

            filterComboBox = new JComboBox( names );
            filterComboBox.setMaximumRowCount( names.length );
            filterComboBox.addActionListener( this );
            filterComboBox.setActionCommand( "CHANGE_ITEMTYPE" );

            JPanel panel4comboBox = new JPanel();
            panel4comboBox.add( new JLabel( "ステータス" ) );
            panel4comboBox.add( filterComboBox );
            addComponent( panel4comboBox, 0, 0, 1, 1 );

            //アイテムを表示するためのJTable
            table = new JTable( );
            table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
            JScrollPane sp = new JScrollPane( table );
            sp.setPreferredSize( new Dimension( 920, 360 ) );
            addComponent( sp, 0, 1, 1, 1 );

            // 行を選択したときのリスナーを設定
            table.addMouseListener( new QueryResultRowChooser() );

            retrieveItems();
        }

        public void actionPerformed( ActionEvent event ) {

            String command = event.getActionCommand();
            System.out.println( "COMAND: " + command );

            retrieveItems();
        }

        public void update( Observable obj, Object arg ) {
            System.out.println( "in " + this.getClass().getName() + " -- update()" );
            retrieveItems();
        }

        /** アイテムを全て列挙する */
        private void retrieveItems() {
            // System.out.println( "retrieveItems()" );

            String selectedStatus = ( String ) filterComboBox.getSelectedItem();
            System.out.println( "選択されたステータス: " + selectedStatus );

            DefaultTableModel model = QueryResultRetriever.retrieve( selectedStatus );

            TableSorter sorter = new TableSorter( model );
            table.setModel( sorter );
            sorter.setTableHeader( table.getTableHeader() );

            // 各カラムの表示幅を指定する
            int[] width = new int[ 6 ];
            width[ 0 ] = 100;
            width[ 1 ] = 100;
            width[ 2 ] = 0;     // ステータスは表示しない
            width[ 3 ] = 120; // 登録日付
            width[ 4 ] = 120; // 更新日付
            width[ 5 ] = 100;
            for ( int i = 0;i < width.length;i++ ) {
                TableColumn col = table.getColumnModel().getColumn( i );
                col.setMinWidth( width[ i ] );
                col.setMaxWidth( width[ i ] );
            }

            this.validate();
            this.repaint();
        }
    }
}
::::::::::::::
RepairmentAction.java
::::::::::::::
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class RepairmentAction extends BaseUpdationAction {
    private final String STATUS = "REPAIRED";

    public RepairmentAction() {
        super();
    }

    public void doAction() throws Exception {
        JTextField guid = ( JTextField ) context[ 0 ];
        JComboBox options = ( JComboBox ) context[ 1 ];
        Object repairerName = options.getSelectedItem();

        if ( guid.getText().length() == 0 ) {
            throw new Exception( "GUIDが入力されていません!" );
        }

        // 選択されたアイテムの属性を更新(この情報は、パネルが持っている)
        java.util.List sourceStatusList = panel.getSourceStatusList();
        try {
            // アイテムのステータスを更新する
            ItemStatusUpdater.update( guid.getText(), sourceStatusList, STATUS, panel.getLoginName() );

            // 修理業者の情報をセットする
            ItemManager manager = ItemManager.getInstance();
            Integer iGuid = new Integer( guid.getText() );
            Item item = manager.getItemByGUID( iGuid );
            item.updateAttribute( "REPAIRER", repairerName );

            // 状態遷移履歴を格納
            ItemHistory history = ItemHistory.getInstance();
            history.insertLog( item );

        } catch ( Exception e ) {
            // System.err.println( e.toString() );
            e.printStackTrace();
        }

        // GUIDの入力フィールドをクリア
        guid.setText( "" );

    }
}

::::::::::::::
RepairmentPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class RepairmentPanel extends BaseUpdationPanel {

    private JComboBox options;

    public RepairmentPanel() {
        super( new String[] {"NEEDS_REPAIRMENT"}, new RepairmentAction() );
        setFocusedComponent( guid );
    }

    public void createInputForm() {

        // ラベル
        inputFormPanel.addComponent( new JLabel( "GUID" ), 0, 0, 1, 1 );

        // GUIDを入力するフィールド
        guid = new JTextField( 6 );
        inputFormPanel.addComponent( guid, 1, 0, 1, 1 );

        //==============================================================
        // Table-Mapped Attributeからリストを取得
        //==============================================================
        Object[][] repairer;
        try {
            repairer = TableMappedAttributeProvider.provide( "Repairer" );
        } catch ( Exception e ) {
            System.err.println( e.toString() );
            return ;
        }

        // ラベル
        inputFormPanel.addComponent( new JLabel( "修理業者" ), 2, 0, 1, 1 );

        // セットする属性値の選択肢
        Object[] names = new Object[ repairer.length ];
        for ( int i = 0;i < names.length;i++ ) {
            names[ i ] = repairer[ i ][ 1 ];
        }
        options = new JComboBox( names );
        inputFormPanel.addComponent( options, 3, 0, 1, 1 );

        // 送信ボタン
        JButton submit = new JButton( "送信" );
        submit.addActionListener( action );
        submit.setActionCommand( "REPAIRMENT" );
        inputFormPanel.addComponent( submit, 4, 0, 1, 1 );

        submit.addKeyListener( adapter );

        // アクションにコンテキストの参照を引き渡す
        Object[] context = new Object[ 2 ];
        context[ 0 ] = guid;
        context[ 1 ] = options;
        action.setContext( context );

    }

    public void setVisibleColomns( String selectedItemTypeName ) {}

}
::::::::::::::
RowSelection.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* <pre>
* テーブル内の特定の行を選択する
* </pre>
*/

public class RowSelection extends MouseAdapter {
    private JTextField guid;
    public RowSelection( JTextField guid ) {
        this.guid = guid;
    }
    public void mousePressed( MouseEvent e ) {
        JTable table = ( JTable ) e.getSource();
        int rowNum = table.getSelectedRow();

        //----------------------------------------------------------------------------------------------------------
        // TableSorterをモデルとしてセットしているので、スーパークラスのAbstractTableModelにキャストする必要がある
        //----------------------------------------------------------------------------------------------------------
        AbstractTableModel model = ( AbstractTableModel ) table.getModel();

        Object valueOfGuid = model.getValueAt( rowNum, 0 );

        guid.setText( valueOfGuid.toString() );
    }
}

::::::::::::::
SpecificItemsRetriever.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;

import javax.swing.table.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* <pre>
* 特定のアイテムタイプに属するアイテムのみのデータを取得する
* </pre>
*/

public class SpecificItemsRetriever {

    /**
    * @param valuesOfStatus 対象ステータス(複数)
    * @param selectedItemTypeName アイテムタイプ名称
    * @return テーブルのモデル
    */
    public static DefaultTableModel retrieve( String[] valuesOfStatus, String selectedItemTypeName ) {

        System.out.println( "In SpecificItemsRetriever: retrieve()" );

        ItemManager manager = ItemManager.getInstance();

        // アイテムタイプから属性の名称を取得する
        ItemType it = manager.getItemTypeByName( selectedItemTypeName );
        java.util.List attributes = it.getAttributes();
        Object[] columnNames = new Object[ attributes.size() ];
        for ( int i = 0;i < attributes.size();i++ ) {
            Attribute attr = ( Attribute ) attributes.get( i );
            columnNames[ i ] = attr.getDisplayName();
        }

        DefaultTableModel model = new DefaultTableModel();
        model.setColumnIdentifiers( columnNames );

        Map map = manager.getGUIDIndex();
        Iterator iterator = map.keySet().iterator();

        while ( iterator.hasNext() ) {
            Integer guid = ( Integer ) iterator.next();
            Item item = ( Item ) map.get( guid );

            ItemType itemType = item.getItemType();
            String itemTypeName = itemType.getName();

            // 選択されたアイテムタイプでなければ読み取らない
            if ( !itemTypeName.equals( selectedItemTypeName ) ) {
                continue;
            }

            String status = ( String ) item.getAttributeValue( "STATUS" );
            boolean found = false;
            for ( int i = 0;i < valuesOfStatus.length;i++ ) {
                if ( status.equals( valuesOfStatus[ i ] ) ) {
                    found = true;
                    break;
                }
            }
            if ( !found ) {
                continue;
            }

            getRecord( item, model );

        }

        return model;
    }

    private static void getRecord( Item item, DefaultTableModel model ) {

        Map map = ( Map ) item.getAttributeMap();
        Object[] rec = new Object[ map.size() ];
        Iterator iterator = map.keySet().iterator();
        int i = 0;
        while ( iterator.hasNext() ) {
            String attrName = ( String ) iterator.next();

            Object value = map.get( attrName );

            rec[ i++ ] = value;

        }

        model.addRow( rec );


    }

}
::::::::::::::
StatusFilterComboBox.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class StatusFilterComboBox extends JComboBox implements Observer {

    public StatusFilterComboBox() {

        super();

        this.addItem( "全選択" );
        this.setSelectedIndex( 0 );

        addUniqueItems();

        //==================================================================-
        // ItemManagerは抽象クラスObservableを継承したものになっている
        //==================================================================-
        ItemManager im = ItemManager.getInstance();
        im.addObserver( this );

    }

    public void update( Observable obj, Object arg ) {

        System.out.println( "in " + this.getClass().getName() + ": UPDATE()" );
        addUniqueItems();

    }

    /**
    * ユニークなステータスを求めて項目に追加する
    */
    private void addUniqueItems() {

        TreeSet statusSet = new TreeSet();

        // 履歴を取り出す
        java.util.List historyList = ItemHistory.getInstance().getHistoryList();

        for ( int i = 0;i < historyList.size();i++ ) {
            Map map = ( Map ) historyList.get( i );
            Object status = map.get( "STATUS" );
            statusSet.add( status );
        }

        java.util.Set itemSet = new HashSet();
        for ( int i = 0;i < this.getItemCount() ;i++ ) {
            itemSet.add( this.getItemAt( i ) );
        }

        Iterator iterator = statusSet.iterator();
        while ( iterator.hasNext() ) {
            Object status = iterator.next();
            if ( !itemSet.contains( status ) ) {
                this.addItem( status );
            }

        }

    }


}
::::::::::::::
TSCommonPanel.java
::::::::::::::
import java.awt.*;

import javax.swing.*;
import javax.swing.event.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class TSCommonPanel extends JPanel implements UserAssociatable {
    protected GridBagLayout layout;
    protected String loginName;

    public TSCommonPanel() {
        super();

        layout = new GridBagLayout();
        this.setLayout( layout );
    }

    /**
    * GridBagLayoutを使ってコンポーネントを配置する
    */
    protected void addComponent( JComponent component, int x, int y, int w, int h ) {

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = w;
        gbc.gridheight = h;
        layout.setConstraints( component, gbc );
        this.add( component );
    }

    /**
    * ユーザと関連付けする 
    * @param loginName オペレータのログイン名
    */
    public void associate( String loginName ) {
        System.out.println( this.getClass().getName() + ": " + loginName );

        this.loginName = loginName;
    }

    /**
    * オペレーションしているユーザを求める 
    */
    protected String getLoginName() {
        return loginName;
    }

}

::::::::::::::
TSMain.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/
public class TSMain extends JFrame implements ActionListener {

    private JTextField loginName;
    private JPasswordField passwd;
    private JButton submit;
    private JButton reset;

    public TSMain() {

        super( "■ログイン画面" );
        setBounds( 128, 256, 480, 600 );

        JPanel panel = new JPanel();
        panel.setPreferredSize( new Dimension( 300, 60 ) );
        panel.setLayout( new GridLayout( 3, 4 ) );

        // 1行目
        panel.add( new JLabel() );
        JLabel label1 = new JLabel( "Login Name", JLabel.RIGHT );
        panel.add( label1 );

        loginName = new JTextField( 10 );
        panel.add( loginName );

        panel.add( new JLabel() );

        // 2行目
        panel.add( new JLabel() );
        JLabel label2 = new JLabel( "Password", JLabel.RIGHT );
        panel.add( label2 );

        passwd = new JPasswordField( 10 );
        panel.add( passwd );

        panel.add( new JLabel() );

        // 3行目
        panel.add( new JLabel() );
        submit = new JButton( "送信" );
        submit.addActionListener( this );
        submit.setActionCommand( "SUBMIT" );
        panel.add( submit );

        submit.addKeyListener( new KeyAdapter() {
                                   public void keyReleased( KeyEvent e ) {
                                       Object keyText = e.getKeyText( e.getKeyCode() );
                                       System.out.println( "Release: " + keyText );

                                       if ( "Enter".equals( keyText ) ) {
                                           System.out.println( "リターンキーが押下されました。" );
                                           doAuthenticate();
                                       }
                                   }
                               }
                             );

        reset = new JButton( "クリア" );
        reset.addActionListener( this );
        reset.setActionCommand( "RESET" );
        panel.add( reset );

        panel.add( new JLabel() );

        // パネルをコンテナに配置
        Container container = getContentPane();
        container.add( panel );

        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setVisible( true );
        pack();
    }

    private void doAuthenticate() {
        try {
            String userName = loginName.getText().trim();

            AccountManager manager = AccountManager.getInstance();
            char[] c = passwd.getPassword();
            String pwstr = new String( c );
            boolean status = manager.authenticateUser( userName, pwstr );
            System.out.println( status );
            if ( status ) {
                TrackingSimulation ts = new TrackingSimulation( userName );

                //==================================================================-
                // ItemManagerは抽象クラスObservableを継承したものになっている
                //==================================================================-
                ItemManager im = ItemManager.getInstance();
                im.addObserver( ts );
            }

        } catch ( Exception e ) {
            e.printStackTrace();
        }

    }

    public void actionPerformed( ActionEvent event ) {

        String command = event.getActionCommand();

        if ( "SUBMIT".equals( command ) ) {
            doAuthenticate();
        }
        if ( "RESET".equals( command ) ) {
            loginName.setText( "" );
            passwd.setText( "" );
        }

        // ログイン名入力フィールドにフォーカスする
        loginName.requestFocusInWindow();

    }

    public static void main( String[] args ) {

        TSMain main = new TSMain();
    }

}
::::::::::::::
TSUtil.java
::::::::::::::
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/
public class TSUtil {

    public static String getCurrentDateTime() {
        Calendar calendar = Calendar.getInstance();

        StringBuffer sb = new StringBuffer();
        sb.append( calendar.get( Calendar.YEAR ) );

        int mm = calendar.get( Calendar.MONTH ) + 1;
        sb.append( "-" + zeroPad( mm ) );

        int dd = calendar.get( Calendar.DATE );
        sb.append( "-" + zeroPad( dd ) );

        int hh = calendar.get( Calendar.HOUR_OF_DAY );
        sb.append( " " + zeroPad( hh ) );

        int mi = calendar.get( Calendar.MINUTE );
        sb.append( ":" + zeroPad( mi ) );

        int ss = calendar.get( Calendar.SECOND );
        sb.append( ":" + zeroPad( ss ) );

        return sb.toString();
    }

    private static String zeroPad( int number ) {
        return ( number < 10 ) ? "0" + number : String.valueOf( number );
    }

}
::::::::::::::
TableMappedAttributeProvider.java
::::::::::::::
import java.io.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class TableMappedAttributeProvider {

    /** ファイルが存在するディレクトリ */
    static final String DIR = "../etc";

    /** インスタンス */
    static private TableMappedAttributeProvider uniqueInstance;

    /** ファイル(=テーブル)ごとに格納されたプロパティのマップ */
    static public Map propertyMap;

    static public Map myHashMap;

    private TableMappedAttributeProvider() {
        /* コンストラクタ */
        propertyMap = new HashMap();
    }

    /** 表イメージの情報を取得
    @param tableName テーブル名
    */
    public static synchronized Object[]
    [] provide( String tableName )
    throws Exception {

        /* 他のスレッドで呼び出す可能性があるので、synchronized修飾子を付けて、排他制御する */
        try {
            if ( uniqueInstance == null ) {
                // 初めて呼ばれたときだけインスタンス化
                uniqueInstance = new TableMappedAttributeProvider();
            }
            if ( !propertyMap.containsKey( tableName ) && propertyMap.get( tableName ) == null ) {

                // ファイルの中身を読み込む
                load( tableName );
            } else {
                /* DO NOTHIING */
            }
            return ( Object[][] ) propertyMap.get( tableName );

        } catch ( Exception e ) {
            throw( e );
        }
    }

    public static synchronized Map getMyHashMap( String tableName )
    throws Exception {

        /* 他のスレッドで呼び出す可能性があるので、synchronized修飾子を付けて、排他制御する */
        try {
            if ( uniqueInstance == null ) {
                // 初めて呼ばれたときだけインスタンス化
                uniqueInstance = new TableMappedAttributeProvider();
            }
            if ( !propertyMap.containsKey( tableName ) && propertyMap.get( tableName ) == null ) {

                // ファイルの中身を読み込む
                load( tableName );
            } else {
                /* DO NOTHIING */
            }
            return ( Map ) myHashMap.get( tableName );

        } catch ( Exception e ) {
            throw( e );
        }
    }


    static public void load( String tableName ) throws Exception {

        if ( myHashMap == null ) {
            myHashMap = new HashMap();
        }

        Properties prop = new Properties();

        try {
            InputStream stream = new FileInputStream( DIR + File.separator + tableName + ".xml" );
            prop.loadFromXML( stream );
            stream.close();

            // 一覧を出力
            prop.list( System.out );

        } catch ( IOException ex ) {
            ex.printStackTrace();
        }

        // 取り出した内容を一旦Listに格納
        Map tempMap = new HashMap();
        List list = new LinkedList();
        Enumeration enumeration = prop.propertyNames();
        while ( enumeration.hasMoreElements() ) {
            String name = ( String ) enumeration.nextElement();
            String value = prop.getProperty( name );

            String[] object = new String[ 2 ];
            object[ 0 ] = name;
            object[ 1 ] = value;
            list.add( object );

            tempMap.put( name, value );
        }
        // キーから値を取得できるようなMAPを登録する
        myHashMap.put( tableName, tempMap );

        // Listを2次元配列に格納してさらにソートする
        String[][] object = new String[ list.size() ][];
        Iterator iterator = list.iterator();
        int i = 0;
        while ( iterator.hasNext() ) {
            String[] pair = ( String[] ) iterator.next();

            object[ i++ ] = pair;

        }

        // 1番目の項目でソートするように設定
        TheComparator comparator = new TheComparator();
        comparator.setIndex( 0 );
        // ソート実施
        Arrays.sort( object, comparator );

        propertyMap.put( tableName, object );

    }

    private static class TheComparator implements Comparator {

        /** ソート対象のカラムの位置 */
        private int index = 0;

        /** ソートするためのカラム位置をセット */
        public void setIndex( int index ) {
            this.index = index;
        }

        public int compare( Object a, Object b ) {
            String[] strA = ( String[] ) a;
            String[] strB = ( String[] ) b;

            return ( strA[ index ].compareTo( strB[ index ] ) );
        }
    }


    static public void main( String[] args ) throws Exception {

        Object[][] arr = TableMappedAttributeProvider.provide( "Warehouse" );

        for ( int i = 0;i < arr.length;i++ ) {
            System.out.println( arr[ i ][ 0 ] + ": " + arr[ i ][ 1 ] );
        }

        Map map = TableMappedAttributeProvider.getMyHashMap( "Warehouse" );
        System.out.println( map.get( "1007" ) );
    }

}
::::::::::::::
TableSorter.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;

import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.*;

/**
 * TableSorter is a decorator for TableModels; adding sorting
 * functionality to a supplied TableModel. TableSorter does
 * not store or copy the data in its TableModel; instead it maintains
 * a map from the row indexes of the view to the row indexes of the
 * model. As requests are made of the sorter (like getValueAt(row, col))
 * they are passed to the underlying model after the row numbers
 * have been translated via the internal mapping array. This way,
 * the TableSorter appears to hold another copy of the table
 * with the rows in a different order.
 * <p/>
 * TableSorter registers itself as a listener to the underlying model,
 * just as the JTable itself would. Events recieved from the model
 * are examined, sometimes manipulated (typically widened), and then
 * passed on to the TableSorter's listeners (typically the JTable).
 * If a change to the model has invalidated the order of TableSorter's
 * rows, a note of this is made and the sorter will resort the
 * rows the next time a value is requested.
 * <p/>
 * When the tableHeader property is set, either by using the
 * setTableHeader() method or the two argument constructor, the
 * table header may be used as a complete UI for TableSorter.
 * The default renderer of the tableHeader is decorated with a renderer
 * that indicates the sorting status of each column. In addition,
 * a mouse listener is installed with the following behavior:
 * <ul>
 * <li>
 * Mouse-click: Clears the sorting status of all other columns
 * and advances the sorting status of that column through three
 * values: {NOT_SORTED, ASCENDING, DESCENDING} (then back to
 * NOT_SORTED again).
 * <li>
 * SHIFT-mouse-click: Clears the sorting status of all other columns
 * and cycles the sorting status of the column through the same
 * three values, in the opposite order: {NOT_SORTED, DESCENDING, ASCENDING}.
 * <li>
 * CONTROL-mouse-click and CONTROL-SHIFT-mouse-click: as above except
 * that the changes to the column do not cancel the statuses of columns
 * that are already sorting - giving a way to initiate a compound
 * sort.
 * </ul>
 * <p/>
 * This is a long overdue rewrite of a class of the same name that
 * first appeared in the swing table demos in 1997.
 * 
 * @author Philip Milne
 * @author Brendon McLean 
 * @author Dan van Enckevort
 * @author Parwinder Sekhon
 * @version 2.0 02/27/04
 */

public class TableSorter extends AbstractTableModel {
    protected TableModel tableModel;

    public static final int DESCENDING = -1;
    public static final int NOT_SORTED = 0;
    public static final int ASCENDING = 1;

    private static Directive EMPTY_DIRECTIVE = new Directive( -1, NOT_SORTED );

    public static final Comparator COMPARABLE_COMAPRATOR = new Comparator() {
                public int compare( Object o1, Object o2 ) {
                    return ( ( Comparable ) o1 ).compareTo( o2 );
                }
            };
    public static final Comparator LEXICAL_COMPARATOR = new Comparator() {
                public int compare( Object o1, Object o2 ) {
                    return o1.toString().compareTo( o2.toString() );
                }
            };

    private Row[] viewToModel;
    private int[] modelToView;

    private JTableHeader tableHeader;
    private MouseListener mouseListener;
    private TableModelListener tableModelListener;
    private Map columnComparators = new HashMap();
    private List sortingColumns = new ArrayList();

    public TableSorter() {
        this.mouseListener = new MouseHandler();
        this.tableModelListener = new TableModelHandler();
    }

    public TableSorter( TableModel tableModel ) {
        this();
        setTableModel( tableModel );
    }

    public TableSorter( TableModel tableModel, JTableHeader tableHeader ) {
        this();
        setTableHeader( tableHeader );
        setTableModel( tableModel );
    }

    private void clearSortingState() {
        viewToModel = null;
        modelToView = null;
    }

    public TableModel getTableModel() {
        return tableModel;
    }

    public void setTableModel( TableModel tableModel ) {
        if ( this.tableModel != null ) {
            this.tableModel.removeTableModelListener( tableModelListener );
        }

        this.tableModel = tableModel;
        if ( this.tableModel != null ) {
            this.tableModel.addTableModelListener( tableModelListener );
        }

        clearSortingState();
        fireTableStructureChanged();
    }

    public JTableHeader getTableHeader() {
        return tableHeader;
    }

    public void setTableHeader( JTableHeader tableHeader ) {
        if ( this.tableHeader != null ) {
            this.tableHeader.removeMouseListener( mouseListener );
            TableCellRenderer defaultRenderer = this.tableHeader.getDefaultRenderer();
            if ( defaultRenderer instanceof SortableHeaderRenderer ) {
                this.tableHeader.setDefaultRenderer( ( ( SortableHeaderRenderer ) defaultRenderer ).tableCellRenderer );
            }
        }
        this.tableHeader = tableHeader;
        if ( this.tableHeader != null ) {
            this.tableHeader.addMouseListener( mouseListener );
            this.tableHeader.setDefaultRenderer(
                new SortableHeaderRenderer( this.tableHeader.getDefaultRenderer() ) );
        }
    }

    public boolean isSorting() {
        return sortingColumns.size() != 0;
    }

    private Directive getDirective( int column ) {
        for ( int i = 0; i < sortingColumns.size(); i++ ) {
            Directive directive = ( Directive ) sortingColumns.get( i );
            if ( directive.column == column ) {
                return directive;
            }
        }
        return EMPTY_DIRECTIVE;
    }

    public int getSortingStatus( int column ) {
        return getDirective( column ).direction;
    }

    private void sortingStatusChanged() {
        clearSortingState();
        fireTableDataChanged();
        if ( tableHeader != null ) {
            tableHeader.repaint();
        }
    }

    public void setSortingStatus( int column, int status ) {
        Directive directive = getDirective( column );
        if ( directive != EMPTY_DIRECTIVE ) {
            sortingColumns.remove( directive );
        }
        if ( status != NOT_SORTED ) {
            sortingColumns.add( new Directive( column, status ) );
        }
        sortingStatusChanged();
    }

    protected Icon getHeaderRendererIcon( int column, int size ) {
        Directive directive = getDirective( column );
        if ( directive == EMPTY_DIRECTIVE ) {
            return null;
        }
        return new Arrow( directive.direction == DESCENDING, size, sortingColumns.indexOf( directive ) );
    }

    private void cancelSorting() {
        sortingColumns.clear();
        sortingStatusChanged();
    }

    public void setColumnComparator( Class type, Comparator comparator ) {
        if ( comparator == null ) {
            columnComparators.remove( type );
        } else {
            columnComparators.put( type, comparator );
        }
    }

    protected Comparator getComparator( int column ) {
        Class columnType = tableModel.getColumnClass( column );
        Comparator comparator = ( Comparator ) columnComparators.get( columnType );
        if ( comparator != null ) {
            return comparator;
        }
        if ( Comparable.class.isAssignableFrom( columnType ) ) {
            return COMPARABLE_COMAPRATOR;
        }
        return LEXICAL_COMPARATOR;
    }

    private Row[] getViewToModel() {
        if ( viewToModel == null ) {
            int tableModelRowCount = tableModel.getRowCount();
            viewToModel = new Row[ tableModelRowCount ];
            for ( int row = 0; row < tableModelRowCount; row++ ) {
                viewToModel[ row ] = new Row( row );
            }

            if ( isSorting() ) {
                Arrays.sort( viewToModel );
            }
        }
        return viewToModel;
    }

    public int modelIndex( int viewIndex ) {
        return getViewToModel() [ viewIndex ].modelIndex;
    }

    private int[] getModelToView() {
        if ( modelToView == null ) {
            int n = getViewToModel().length;
            modelToView = new int[ n ];
            for ( int i = 0; i < n; i++ ) {
                modelToView[ modelIndex( i ) ] = i;
            }
        }
        return modelToView;
    }

    // TableModel interface methods

    public int getRowCount() {
        return ( tableModel == null ) ? 0 : tableModel.getRowCount();
    }

    public int getColumnCount() {
        return ( tableModel == null ) ? 0 : tableModel.getColumnCount();
    }

    public String getColumnName( int column ) {
        return tableModel.getColumnName( column );
    }

    public Class getColumnClass( int column ) {
        return tableModel.getColumnClass( column );
    }

    public boolean isCellEditable( int row, int column ) {
        return tableModel.isCellEditable( modelIndex( row ), column );
    }

    public Object getValueAt( int row, int column ) {
        return tableModel.getValueAt( modelIndex( row ), column );
    }

    public void setValueAt( Object aValue, int row, int column ) {
        tableModel.setValueAt( aValue, modelIndex( row ), column );
    }

    // Helper classes

    private class Row implements Comparable {
        private int modelIndex;

        public Row( int index ) {
            this.modelIndex = index;
        }

        public int compareTo( Object o ) {
            int row1 = modelIndex;
            int row2 = ( ( Row ) o ).modelIndex;

            for ( Iterator it = sortingColumns.iterator(); it.hasNext(); ) {
                Directive directive = ( Directive ) it.next();
                int column = directive.column;
                Object o1 = tableModel.getValueAt( row1, column );
                Object o2 = tableModel.getValueAt( row2, column );

                int comparison = 0;
                // Define null less than everything, except null.
                if ( o1 == null && o2 == null ) {
                    comparison = 0;
                } else if ( o1 == null ) {
                    comparison = -1;
                } else if ( o2 == null ) {
                    comparison = 1;
                } else {
                    comparison = getComparator( column ).compare( o1, o2 );
                }
                if ( comparison != 0 ) {
                    return directive.direction == DESCENDING ? -comparison : comparison;
                }
            }
            return 0;
        }
    }

    private class TableModelHandler implements TableModelListener {
        public void tableChanged( TableModelEvent e ) {
            // If we're not sorting by anything, just pass the event along.
            if ( !isSorting() ) {
                clearSortingState();
                fireTableChanged( e );
                return ;
            }

            // If the table structure has changed, cancel the sorting; the
            // sorting columns may have been either moved or deleted from
            // the model.
            if ( e.getFirstRow() == TableModelEvent.HEADER_ROW ) {
                cancelSorting();
                fireTableChanged( e );
                return ;
            }

            // We can map a cell event through to the view without widening
            // when the following conditions apply:
            //
            // a) all the changes are on one row (e.getFirstRow() == e.getLastRow()) and,
            // b) all the changes are in one column (column != TableModelEvent.ALL_COLUMNS) and,
            // c) we are not sorting on that column (getSortingStatus(column) == NOT_SORTED) and,
            // d) a reverse lookup will not trigger a sort (modelToView != null)
            //
            // Note: INSERT and DELETE events fail this test as they have column == ALL_COLUMNS.
            //
            // The last check, for (modelToView != null) is to see if modelToView
            // is already allocated. If we don't do this check; sorting can become
            // a performance bottleneck for applications where cells
            // change rapidly in different parts of the table. If cells
            // change alternately in the sorting column and then outside of
            // it this class can end up re-sorting on alternate cell updates -
            // which can be a performance problem for large tables. The last
            // clause avoids this problem.
            int column = e.getColumn();
            if ( e.getFirstRow() == e.getLastRow()
                    && column != TableModelEvent.ALL_COLUMNS
                    && getSortingStatus( column ) == NOT_SORTED
                    && modelToView != null ) {
                int viewIndex = getModelToView() [ e.getFirstRow() ];
                fireTableChanged( new TableModelEvent( TableSorter.this,
                                                       viewIndex, viewIndex,
                                                       column, e.getType() ) );
                return ;
            }

            // Something has happened to the data that may have invalidated the row order.
            clearSortingState();
            fireTableDataChanged();
            return ;
        }
    }

    private class MouseHandler extends MouseAdapter {
        public void mouseClicked( MouseEvent e ) {
            JTableHeader h = ( JTableHeader ) e.getSource();
            TableColumnModel columnModel = h.getColumnModel();
            int viewColumn = columnModel.getColumnIndexAtX( e.getX() );
            int column = columnModel.getColumn( viewColumn ).getModelIndex();
            if ( column != -1 ) {
                int status = getSortingStatus( column );
                if ( !e.isControlDown() ) {
                    cancelSorting();
                }
                // Cycle the sorting states through {NOT_SORTED, ASCENDING, DESCENDING} or
                // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether shift is pressed.
                status = status + ( e.isShiftDown() ? -1 : 1 );
                status = ( status + 4 ) % 3 - 1; // signed mod, returning {-1, 0, 1}
                setSortingStatus( column, status );
            }
        }
    }

    private static class Arrow implements Icon {
        private boolean descending;
        private int size;
        private int priority;

        public Arrow( boolean descending, int size, int priority ) {
            this.descending = descending;
            this.size = size;
            this.priority = priority;
        }

        public void paintIcon( Component c, Graphics g, int x, int y ) {
            Color color = c == null ? Color.GRAY : c.getBackground();
            // In a compound sort, make each succesive triangle 20%
            // smaller than the previous one.
            int dx = ( int ) ( size / 2 * Math.pow( 0.8, priority ) );
            int dy = descending ? dx : -dx;
            // Align icon (roughly) with font baseline.
            y = y + 5 * size / 6 + ( descending ? -dy : 0 );
            int shift = descending ? 1 : -1;
            g.translate( x, y );

            // Right diagonal.
            g.setColor( color.darker() );
            g.drawLine( dx / 2, dy, 0, 0 );
            g.drawLine( dx / 2, dy + shift, 0, shift );

            // Left diagonal.
            g.setColor( color.brighter() );
            g.drawLine( dx / 2, dy, dx, 0 );
            g.drawLine( dx / 2, dy + shift, dx, shift );

            // Horizontal line.
            if ( descending ) {
                g.setColor( color.darker().darker() );
            } else {
                g.setColor( color.brighter().brighter() );
            }
            g.drawLine( dx, 0, 0, 0 );

            g.setColor( color );
            g.translate( -x, -y );
        }

        public int getIconWidth() {
            return size;
        }

        public int getIconHeight() {
            return size;
        }
    }

    private class SortableHeaderRenderer implements TableCellRenderer {
        private TableCellRenderer tableCellRenderer;

        public SortableHeaderRenderer( TableCellRenderer tableCellRenderer ) {
            this.tableCellRenderer = tableCellRenderer;
        }

        public Component getTableCellRendererComponent( JTable table,
                Object value,
                boolean isSelected,
                boolean hasFocus,
                int row,
                int column ) {
            Component c = tableCellRenderer.getTableCellRendererComponent( table,
                          value, isSelected, hasFocus, row, column );
            if ( c instanceof JLabel ) {
                JLabel l = ( JLabel ) c;
                l.setHorizontalTextPosition( JLabel.LEFT );
                int modelColumn = table.convertColumnIndexToModel( column );
                l.setIcon( getHeaderRendererIcon( modelColumn, l.getFont().getSize() ) );
            }
            return c;
        }
    }

    private static class Directive {
        private int column;
        private int direction;

        public Directive( int column, int direction ) {
            this.column = column;
            this.direction = direction;
        }
    }
}

::::::::::::::
TrackingSimulation.java
::::::::::::::
import java.awt.*;
import javax.swing.*;
import java.util.*;

/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
*/

public class TrackingSimulation extends JFrame implements Observer {

    /** メニュー選択用のTabbedPane */
    private JTabbedPane jtp;

    private String loginName;

    public TrackingSimulation( String loginName ) {

        super( loginName + " さんの操作画面" );
        setBounds( 10, 10, 960, 640 );
        Container container = getContentPane();

        this.loginName = loginName;

        jtp = new JTabbedPane();

        // 各処理の画面を追加していく
        jtp.addTab( "アイテム登録", new ItemCreationPanel() );
        jtp.addTab( "アイテム登録(ファイルインポート)", new ImportedItemCreationPanel() );

        jtp.addTab( "受入前検査", new InspectionPanel() );
        jtp.addTab( "受入", new CheckInPanel() );
        jtp.addTab( "払出前検査", new InspectionBeforeCheckOutPanel() );
        jtp.addTab( "払出", new CheckOutPanel() );

        jtp.addTab( "修理委託", new RepairmentPanel() );
        jtp.addTab( "廃棄", new DisposalPanel() );

        jtp.addTab( "■照会■", new ItemQueryPanel() );

        // ChangeListenerを追加
        jtp.addChangeListener( new MyChangeListener() );

        // 各JTabbedPaneに割り当てられたパネルに対してオペレータとの関連付けする
        int tabCount = jtp.getTabCount();
        System.out.println( "tabCount=" + tabCount );
        for ( int i = 0;i < tabCount;i++ ) {
            JComponent component = ( JComponent ) jtp.getComponentAt( i );

            if ( component instanceof ItemQueryPanel ) {
                // ItemQueryPanelの場合は対象外
                continue;
            }

            ( ( UserAssociatable ) component ).associate( loginName );
        }

        // JTabbedPaneをコンテナに追加
        container.add( jtp );

        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setVisible( true );
    }

    public void update( Observable obj, Object arg ) {

        System.out.println( "update() -- " + loginName );

        // 現在開いている画面をリロード
        int index = jtp.getSelectedIndex();
        JComponent component = ( JComponent ) jtp.getComponentAt( index );
        if ( component instanceof BaseUpdationPanel ) {
            // 初期化メソッドの実行
            ( ( BaseUpdationPanel ) component ).reload();
        }

    }

    /** 単体テスト用メイン */
    public static void main( String args[] ) {
        new TrackingSimulation( "suzuki" );
    }
}



::::::::::::::
UserAssociatable.java
::::::::::::::
/**
* $Id: TabbedPane.html,v 1.1 2009/06/22 16:11:59 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public interface UserAssociatable {

    public void associate( String userName );
}


inserted by FC2 system