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 );
}
}
}
}
戻る