XMLを読み込み、JTreeで表示する
戻る
処理対象XMLのサンプル
::::::::::::::
Division.java
::::::::::::::
import java.util.*;
import java.io.*;
/**
* $Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class Division extends Organization {
private String address;
private List employees;
public Division( String name ) {
super( name );
employees = new LinkedList();
}
public void setAddress( String address ) {
this.address = address;
}
public void addEmployee( Employee employee ) {
employees.add( employee );
}
public String getAddress() {
return address;
}
public List getEmployees() {
return employees;
}
public static void main( String[] args ) {
Division div1 = new Division( "管理本部" );
System.out.println( div1.getName() );
}
}
::::::::::::::
Employee.java
::::::::::::::
/**
* $Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
*/
public class Employee {
private String name;
private Gender gender;
public Employee() {}
public Employee( String name, Gender gender ) {
this.name = name;
this.gender = gender;
}
public void setProperties( String name, Gender gender ) {
this.name = name;
this.gender = gender;
}
public void setName( String name ) {
this.name = name;
}
public void setGender( Gender gender ) {
this.gender = gender;
}
public String getName() {
return name;
}
public Gender getGender() {
return gender;
}
public static void main( String[] args ) {
Employee employee = new Employee( "岸", Gender.MALE );
System.out.println( employee.getGender() );
}
}
::::::::::::::
Gender.java
::::::::::::::
public enum Gender {
MALE, FEMALE;
}
::::::::::::::
IconProvider.java
::::::::::::::
import javax.swing.*;
/**
* $Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
*/
public class IconProvider {
private static Icon maleIcon = new ImageIcon( "../etc/male.gif" );
private static Icon femaleIcon = new ImageIcon( "../etc/female.gif" );
public static Icon getMaleIcon() {
return maleIcon;
}
public static Icon getFemaleIcon() {
return femaleIcon;
}
}
::::::::::::::
JTreeTest.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class JTreeTest extends JFrame {
private MainPanel mainPanel;
private JPanel bottomPanel;
public JTreeTest() {
mainPanel = new MainPanel();
mainPanel.setBackground( Color.green );
bottomPanel = new JPanel();
bottomPanel.setBackground( Color.cyan );
bottomPanel.add( new JLabel( "CONFIDENTIAL" ) );
// コンテナに各パネルを配置
Container container = this.getContentPane();
container.add( mainPanel, BorderLayout.CENTER );
container.add( bottomPanel, BorderLayout.SOUTH );
}
public static void main( String[] args ) {
/* 自分自身を作成 */
JTreeTest viewer = new JTreeTest();
/* 終了処理を追加 */
viewer.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent e ) {
System.exit( 0 );
}
}
);
/* サイズと位置を指定 */
viewer.setBounds( 10, 10, 400, 600 );
/* 実際に表示する */
viewer.setTitle( "XMLを読み込み、JTree上に表示する" );
viewer.setVisible( true );
}
}
::::::::::::::
MainPanel.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class MainPanel extends JPanel {
private JTree tree;
private DefaultMutableTreeNode root;
private DefaultTreeModel model;
public MainPanel() {
super();
root = new DefaultMutableTreeNode( "とある会社の組織図" );
model = new DefaultTreeModel( root );
// model.addTreeModelListener( new TreeExpander() );
tree = new JTree( model );
// スクロールするペインを追加
JScrollPane scrPane = new JScrollPane();
scrPane.getViewport().setView( tree );
scrPane.setPreferredSize( new Dimension( 360, 480 ) );
this.add( scrPane );
renderTree();
}
private void renderTree() {
// 非常にベタな動作確認用のサンプルコード
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
// root.add( new DefaultMutableTreeNode( "テスト" ) );
//
// DefaultMutableTreeNode node1 = new DefaultMutableTreeNode( "ノード1" );
// DefaultMutableTreeNode node2 = new DefaultMutableTreeNode( "ノード2" );
//
// node1.add( node2 );
// root.add( node1 );
try {
Organization org = new Organization( "とある組織" );
// XMLから情報取得
OrganizationDataRetriever.retrieve( org, "../etc/division.xml" );
// モデルに対してノードを追加していく
OrganizationDataRetriever.addNode( org, root );
} catch ( Exception e ) {}
model.reload();
}
}
::::::::::::::
Organization.java
::::::::::::::
import java.util.*;
import java.io.*;
/**
* $Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class Organization {
protected List divisions;
protected String name;
public Organization( String name ) {
this.name = name;
divisions = new LinkedList();
}
protected void addDivision( Division division ) {
divisions.add( division );
}
protected String getName() {
return name;
}
protected List getDivisions() {
return divisions;
}
}
::::::::::::::
OrganizationDataRetriever.java
::::::::::::::
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
import javax.swing.tree.DefaultMutableTreeNode;
/**
* $Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
* @author KISHI Yasuhiro
* DOMを使ってXML内の全要素の属性、値を取得
*/
public class OrganizationDataRetriever {
public static void retrieve( Organization org, String fileName ) throws Exception {
try {
// ドキュメントビルダーファクトリを生成
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
// ドキュメントビルダーを生成
DocumentBuilder builder = dbfactory.newDocumentBuilder();
// パースを実行してDocumentオブジェクトを取得
Document document = builder.parse( new File( fileName ) );
Node node = document.getDocumentElement();
traverse( node, 0, org );
} catch ( Exception e ) {
throw e;
}
}
private static void traverse( Node node, int layer, Object parentObject ) {
// 子要素のリストを取得
Node childNode = node.getFirstChild();
while ( childNode != null ) {
String nodeName = childNode.getNodeName();
if ( "division".equals( nodeName ) ) {
// getAttribute()はElementクラスが持つメソッドなのでキャストする必要がある
String id = ( ( Element ) childNode ).getAttribute( "id" );
String name = ( ( Element ) childNode ).getAttribute( "name" );
indent( layer );
System.out.print( nodeName );
System.out.print( "\t" );
System.out.print( id );
System.out.print( "\t" );
System.out.print( name );
System.out.println();
Division division = new Division( name );
// System.out.println(division);
// System.out.println(parentObject);
( ( Organization ) parentObject ).addDivision( division );
//-----------------------------------------------
// さらに下を走査
//-----------------------------------------------
traverse( childNode, layer + 1, division );
}
if ( "employee".equals( nodeName ) ) {
String id = ( ( Element ) childNode ).getAttribute( "id" );
indent( layer );
System.out.print( nodeName );
System.out.print( "\t" );
System.out.print( id );
System.out.println();
Employee employee = new Employee();
( ( Division ) parentObject ).addEmployee( employee );
//-----------------------------------------------
// さらに下を走査
//-----------------------------------------------
traverse( childNode, layer + 1, employee );
}
if ( "address".equals( nodeName ) ) {
printNode( childNode, layer );
String address = childNode.getFirstChild().getNodeValue();
( ( Division ) parentObject ).setAddress( address.trim() );
}
if ( "name".equals( nodeName ) ) {
printNode( childNode, layer );
String name = childNode.getFirstChild().getNodeValue();
( ( Employee ) parentObject ).setName( name.trim() );
}
if ( "gender".equals( nodeName ) ) {
printNode( childNode, layer );
String nodeValue = childNode.getFirstChild().getNodeValue();
Gender gender = null;
if ( "M".equals( nodeValue.trim() ) ) {
gender = Gender.MALE;
}
if ( "F".equals( nodeValue.trim() ) ) {
gender = Gender.FEMALE;
}
( ( Employee ) parentObject ).setGender( gender );
}
childNode = childNode.getNextSibling();
}
}
/**
* ノード名と値を表示する
*/
private static void printNode( Node node, int layer ) {
String nodeName = node.getNodeName();
String nodeValue = node.getFirstChild().getNodeValue();
indent( layer );
System.out.print( nodeName );
System.out.print( "\t" );
System.out.print( nodeValue.trim() );
System.out.println();
}
private static void indent( int layer ) {
for ( int i = 0;i < layer;i++ ) {
System.out.print( " " );
}
}
private static void crawlDivision( Object object, int layer ) {
if ( object instanceof Organization ) {
List divisions = ( ( Organization ) object ).getDivisions();
Iterator iterator = divisions.iterator();
while ( iterator.hasNext() ) {
Division division = ( Division ) iterator.next();
indent( layer );
System.out.println( division.getName() + " : " + division.getAddress() );
List employees = division.getEmployees();
for ( int i = 0;i < employees.size();i++ ) {
Employee employee = ( Employee ) employees.get( i );
indent( layer );
System.out.print( "-- " );
System.out.println( employee.getName() + " (" + employee.getGender() + ")" );
}
crawlDivision( division, layer + 1 );
}
}
}
public static void addNode( Object object, DefaultMutableTreeNode node ) throws Exception {
if ( object instanceof Organization ) {
List divisions = ( ( Organization ) object ).getDivisions();
Iterator iterator = divisions.iterator();
while ( iterator.hasNext() ) {
Division division = ( Division ) iterator.next();
// 部署名
DefaultMutableTreeNode divisionNode = new DefaultMutableTreeNode( division.getName() );
node.add( divisionNode );
// 住所
DefaultMutableTreeNode addressNode = new DefaultMutableTreeNode( "〒 " + division.getAddress() );
divisionNode.add( addressNode );
List employees = division.getEmployees();
for ( int i = 0;i < employees.size();i++ ) {
Employee employee = ( Employee ) employees.get( i );
// 従業員
DefaultMutableTreeNode employeeNode = new DefaultMutableTreeNode( employee.getName() + " (" + employee.getGender() + ")" );
divisionNode.add( employeeNode );
}
addNode( division, divisionNode );
}
}
}
public static void main( String[] args ) throws Exception {
Organization org = new Organization( "とある組織" );
OrganizationDataRetriever.retrieve( org, "../etc/division.xml" );
OrganizationDataRetriever.crawlDivision( org, 0 );
/**
List divisions = org.getDivisions();
Iterator iterator = divisions.iterator();
while ( iterator.hasNext() ) {
Division division = ( Division ) iterator.next();
System.out.println( division.getName() + " : " + division.getAddress() );
List list = division.getDivisions();
Iterator itrt = list.iterator();
while ( itrt.hasNext() ) {
Division div = ( Division ) itrt.next();
System.out.println( div.getName() );
}
}
**/
}
}
::::::::::::::
TreeExpander.java
::::::::::::::
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
/**
$Id: JTreeTest.html,v 1.1 2009/06/22 16:11:48 kishi Exp kishi $
@author KISHI Yasuhiro
*/
public class TreeExpander implements TreeModelListener {
public void treeNodesChanged( TreeModelEvent e ) {
// Invoked after a node (or a set of siblings) has changed in some way.
}
public void treeNodesInserted( TreeModelEvent e ) {
// Invoked after nodes have been inserted into the tree.
System.out.println( "INSERTED..." );
}
public void treeNodesRemoved( TreeModelEvent e ) {
// Invoked after nodes have been removed from the tree.
}
public void treeStructureChanged( TreeModelEvent e ) {
// Invoked after the tree has drastically changed structure from a given node down.
}
}
戻る