オブジェクトのserializeとdeserialize
戻る
::::::::::::::
ChildrenList.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.tree.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class ChildrenList extends JPanel
implements ActionListener, TreeSelectionListener {
private DefaultTableModel model;
private JTable table;
public ChildrenList() {
model = new DefaultTableModel();
/* カラム名をセットしないと表は表示されないよ!→注意! */
model.addColumn( "#" );
model.addColumn( "名前" );
table = new JTable( model );
// スクロールペイン
JScrollPane scrPane = new JScrollPane();
scrPane.getViewport().setView( table );
scrPane.setPreferredSize( new Dimension( 200, 500 ) );
// スクロールペインを自身に追加
this.add( scrPane );
}
public void actionPerformed( ActionEvent e ) {
String action = e.getActionCommand();
if ( action.equals( "Add" ) ) {
System.out.println( "in ChildrenList: 「追加」のアクションが選択されたようです!" );
}
if ( action.equals( "Del" ) ) {
System.out.println( "in ChildrenList: 「削除」のアクションが選択されたようです!" );
}
}
public synchronized void valueChanged( TreeSelectionEvent e ) {
JTree tree = ( JTree ) e.getSource();
DefaultMutableTreeNode node = ( DefaultMutableTreeNode ) tree.getLastSelectedPathComponent();
if ( node != null ) {
// truncateする
model.setRowCount( 0 );
System.out.println( "in ChildrenList: " + ( String ) node.getUserObject() + "が選択されました!" ) ;
System.out.println( "子ノードの数は、" + node.getChildCount() + "です。" );
// 子ノードのリストを出力する
Vector vector = new Vector();
Enumeration enumeration = node.children();
for ( int i = 0; enumeration.hasMoreElements();i++ ) {
DefaultMutableTreeNode childNode = ( DefaultMutableTreeNode ) enumeration.nextElement();
System.out.println( childNode.getUserObject() );
String[] rowData = new String[ 2 ];
rowData[ 0 ] = new Integer( i ).toString();
rowData[ 1 ] = ( String ) childNode.getUserObject();
model.addRow( rowData );
}
System.out.println( "現在の行数 = " + model.getRowCount() );
}
}
}
::::::::::::::
NodeEditor.java
::::::::::::::
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.tree.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class NodeEditor extends JPanel implements TreeSelectionListener {
private JTextField text;
private JButton editButton;
public NodeEditor() {
//-------------------------------------------------------------------------
// 各々のノードにセットされたオブジェクトを変更するための入力フィールド
//-------------------------------------------------------------------------
text = new JTextField( 30 );
//------------------------
// ノード編集ボタン
//------------------------
editButton = new JButton( "Edit" );
// ノード編集のための入力テキスト・編集ボタンをパネルに追加
this.add( text );
this.add( editButton );
}
public JButton getEditButton() {
return editButton;
}
public String getText() {
return text.getText();
}
// TreeSelectionListenerを実装するクラスは必ず下記メソッドを実装する必要あり
public synchronized void valueChanged( TreeSelectionEvent e ) {
JTree tree = ( JTree ) e.getSource();
DefaultMutableTreeNode node = ( DefaultMutableTreeNode ) tree.getLastSelectedPathComponent();
if ( node != null ) {
System.out.println( "in NodeEditor: " + ( String ) node.getUserObject() + "が選択されました!" ) ;
text.setText( ( String ) node.getUserObject() );
}
}
}
::::::::::::::
ObjectDeserializer.java
::::::::::::::
import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class ObjectDeserializer {
static Object deserialize( String fileName ) throws Exception {
Object object;
try {
FileInputStream inFile = new FileInputStream( fileName );
ObjectInputStream ois = new ObjectInputStream( inFile );
object = ois.readObject();
ois.close();
inFile.close();
} catch ( Exception e ) {
throw e;
}
return object;
}
static public void main( String[] args ) {
try {
Date date = ( Date ) ObjectDeserializer.deserialize( "test.ser" );
System.out.println( date );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
::::::::::::::
ObjectManager.java
::::::::::::::
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.net.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
*/
public class ObjectManager extends AbstractAction {
private DefaultTreeModel treeModel;
public ObjectManager( DefaultTreeModel treeModel ) {
this.treeModel = treeModel;
}
public void actionPerformed( ActionEvent e ) {
String action = e.getActionCommand();
System.out.println( action );
if ( "SERIALIZE".equals( action ) ) {
try {
ObjectSerializer.serialize( treeModel, TreeRenderer.SER_FILE );
} catch ( Exception exp ) {
exp.printStackTrace();
}
}
}
}
::::::::::::::
ObjectSerializer.java
::::::::::::::
import java.util.*;
import java.io.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class ObjectSerializer {
static void serialize( Object object, String fileName ) throws Exception {
try {
FileOutputStream outFile = new FileOutputStream( fileName );
ObjectOutput oos = new ObjectOutputStream( outFile );
oos.writeObject( object );
oos.flush();
oos.close();
outFile.close();
} catch ( Exception e ) {
throw e;
}
}
static public void main( String[] args ) {
Date date = new Date();
try {
ObjectSerializer.serialize( date, "test.ser" );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
::::::::::::::
TreeRenderer.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: serialize.html,v 1.1 2009/06/22 16:12:25 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class TreeRenderer extends JFrame implements ActionListener {
/** シリアライズされたtreeModelの出力先 */
static final String SER_FILE = "model.ser";
/** 各ノードの名前を変更するための入力フィールド */
private JTextField text;
private JLabel label;
private JTree tree;
/** JTreeは単なるVIEWなのでデータはDefaultTreeModelにセットする(つまりMODELである) */
private DefaultTreeModel treeModel;
private NodeEditor nodeEditor; // 本当はここに参照先を持ちたくない=分離したい(何かいい方法はないか?)
public static void main( String[] args ) {
/* 自分自身を作成 */
TreeRenderer viewer = new TreeRenderer();
/* 終了処理を追加 */
viewer.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit( 0 );
}
}
);
/* サイズと位置を指定 */
viewer.setBounds( 10, 10, 400, 600 );
/* 実際に表示する */
viewer.setTitle( "ツリー追加削除の実験 その2" );
viewer.setVisible( true );
viewer.pack();
}
public TreeRenderer() {
try {
treeModel = ( DefaultTreeModel ) ObjectDeserializer.deserialize( SER_FILE );
;
} catch ( Exception exp ) {
exp.printStackTrace();
// 初期値をセット
DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode( "root" );
treeModel = new DefaultTreeModel( rootTreeNode );
}
// VIEWにMODELを紐付けする
tree = new JTree( treeModel );
// JTreeを表示するためのスクロールするペインを追加
JScrollPane scrPane = new JScrollPane();
scrPane.getViewport().setView( tree );
scrPane.setPreferredSize( new Dimension( 400, 500 ) );
JPanel treePanel = new JPanel();
treePanel.add( scrPane );
//----------------------------------------------------
// 選択したノードの子供のリストを表示するパネル
//----------------------------------------------------
ChildrenList childrenList = new ChildrenList();
//------------------------------------------------------
// ノード選択イベントを伝播させるためにリスナーを登録
// つまりノードが選択されたときに、選択されたノード以下の子ノードリストを出力するため
//------------------------------------------------------
tree.addTreeSelectionListener( childrenList );
//------------------------
// ノード追加ボタン
//------------------------
JButton addButton = new JButton( "Add" );
addButton.addActionListener( this );
//-------------------------------------
// イベントをchildrenListに通知する
//-------------------------------------
addButton.addActionListener( childrenList );
addButton.setActionCommand( "Add" );
//------------------------
// ノード削除ボタン
//------------------------
JButton delButton = new JButton( "Del" );
delButton.addActionListener( this );
//-------------------------------------
// イベントをchildrenListに通知する
//-------------------------------------
delButton.addActionListener( childrenList );
delButton.setActionCommand( "Del" );
/*******************************************************/
/* シリアライズ・デシリアライズするためのボタン */
/*******************************************************/
Action objectManager = new ObjectManager( treeModel );
// シリアライズするボタン
JButton serializeButton = new JButton( "Serialize" );
serializeButton.addActionListener( objectManager );
serializeButton.setActionCommand( "SERIALIZE" );
// 未使用
label = new JLabel();
// 追加ボタン・削除ボタンをパネルに追加
JPanel commandPanel = new JPanel();
commandPanel.add( addButton );
commandPanel.add( delButton );
commandPanel.add( serializeButton );
commandPanel.add( label );
//------------------------------------------------------------------------------------------------------
// 各々のノードにセットされたオブジェクトを変更するための入力フィールド・編集ボタンを配置したクラス
//------------------------------------------------------------------------------------------------------
nodeEditor = new NodeEditor();
JButton editButton = nodeEditor.getEditButton();
editButton.addActionListener( this );
editButton.setActionCommand( "Edit" );
tree.addTreeSelectionListener( nodeEditor );
//-----------------------------------------------------
// 最終的に全ての部品をContainerに配置する
//-----------------------------------------------------
Container content = this.getContentPane();
content.add( nodeEditor, BorderLayout.NORTH );
content.add( treePanel, BorderLayout.CENTER );
content.add( childrenList, BorderLayout.EAST );
content.add( commandPanel, BorderLayout.SOUTH );
}
public JLabel getLabel() {
return this.label;
}
public synchronized void actionPerformed( ActionEvent e ) {
// synchronized修飾子をつけたほうがいいです!
String action = e.getActionCommand();
/* 現在選択されているノードを取得する */
DefaultMutableTreeNode node = ( DefaultMutableTreeNode ) tree.getLastSelectedPathComponent();
if ( node != null ) {
System.out.println( node.getUserObject() + " が選択されています。" );
/* 現在選択されているノードまでのTreePathを取得 */
TreePath treePath = tree.getSelectionPath();
int count = treePath.getPathCount();
Object pathComponent = treePath.getPathComponent( count - 1 );
if ( action.equals( "Add" ) ) {
// ノード追加 -- とりあえず3個に固定 -- 実は他に応用したい事例がある(^^)
for ( int i = 0;i < 3;i++ ) {
String prefix;
prefix = pathComponent.toString();
node.add( new DefaultMutableTreeNode( prefix + "-" + i ) );
}
// ノードが追加された部分を展開する
treeModel.reload();
tree.expandPath( treePath );
} else if ( action.equals( "Del" ) ) {
// ノード削除
node.removeFromParent();
treeModel.reload();
tree.expandPath( treePath.getParentPath() );
} else if ( action.equals( "Edit" ) ) {
// ノード編集
System.out.println( "Editボタンがクリックされました!" );
// nodeEditor内のtextを取得
String text = nodeEditor.getText();
System.out.println( "テキストの値は、「" + text + "」です。" );
// 現在選択されているノードに新しい値をセット
node.setUserObject( ( String ) text );
// リロードする
treeModel.reload();
tree.expandPath( treePath.getParentPath() );
}
}
}
}
戻る