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. } }
戻る inserted by FC2 system