JTableで表示するカラムをJCheckBoxで設定する

戻る



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

import java.util.*;

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

/**
* $Id: ItemHistory.html,v 1.1 2009/06/22 16:11:47 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: ItemHistory.html,v 1.1 2009/06/22 16:11:47 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: ItemHistory.html,v 1.1 2009/06/22 16:11:47 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: ItemHistory.html,v 1.1 2009/06/22 16:11:47 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();
        }
    }
}
::::::::::::::
StatusFilterComboBox.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

import java.util.*;

/**
* $Id: ItemHistory.html,v 1.1 2009/06/22 16:11:47 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 );
            }

        }

    }


}


戻る inserted by FC2 system