import java.awt.*; import java.awt.event.*; import java.util.Enumeration; import javax.swing.*; import javax.swing.tree.*; /** * @version 1.0 2002-06-16 * @author Takashi KOBAYASHI */ public class memo09ex2 { JTree tree; /** * mainメソッド */ public static void main( String[] args ) { // memo09ex2クラスのインスタンスの生成 // 以下で、インナークラスから呼び出すためfinalを宣言 final memo09ex2 ex2 = new memo09ex2(); // 交換処理exchangeを呼び出すボタンの生成 JButton button = new JButton( "Exchange" ); button.addActionListener( new ActionListener(){ public void actionPerformed( ActionEvent e ) { TreePath path = ex2.tree.getSelectionPath(); if( path == null ) return; ex2.exchange( ex2.tree.getModel(), (TreeNode)path.getLastPathComponent() ); } } ); // ウインドウの作成とJTree, JButtonの追加 // レイアウトをBorderLayoutに設定 JFrame frame = new JFrame( "Create Tree" ); Container cont = frame.getContentPane(); cont.setLayout( new BorderLayout() ); cont.add( ex2.tree, BorderLayout.CENTER ); cont.add( button, BorderLayout.SOUTH ); // ウインドウのクローズボタンが押された場合の処理など frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.pack(); frame.setVisible( true ); } /** * デフォルトコンストラクタ */ public memo09ex2() { tree = new JTree( new DefaultMutableTreeNode( "SwingSwinging.com" ) ); TreeModel model = tree.getModel(); TreeNode root = (TreeNode)model.getRoot(); // ルートの直接の子供の枝の作成 ( (DefaultMutableTreeNode)root ).add( new DefaultMutableTreeNode( "Column" ) ); ( (DefaultMutableTreeNode)root ).add( new DefaultMutableTreeNode( "Desktop Java" ) ); // ルートの孫の枝の作成 Enumeration enum = root.children(); DefaultMutableTreeNode node; while( enum.hasMoreElements() ) { node = (DefaultMutableTreeNode)enum.nextElement(); // 子供の枝の中身を調べて、孫を追加 if( node.getUserObject().equals( "Column" ) ) { node.add( new DefaultMutableTreeNode( "JavaMemo" ) ); node.add( new DefaultMutableTreeNode( "Diary" ) ); } else if( node.getUserObject().equals( "Desktop Java" ) ) node.add( new DefaultMutableTreeNode( "Not ReadMe" ) ); } // モデルへの反映 ( (DefaultTreeModel)model ).reload(); } /** * 枝の交換を行う * @param model 交換を行う枝の属するツリーのモデル * @param mode 親と交換を行う枝 */ public void exchange( TreeModel model, TreeNode node ) { if( model == null || node == null ) return; DefaultMutableTreeNode mute; // 引数のチェック if( ( node instanceof DefaultMutableTreeNode ) && node.getParent() != null ) mute = ( DefaultMutableTreeNode )node; else return; DefaultMutableTreeNode parent = ( DefaultMutableTreeNode )mute.getParent(); // 交換する枝の子供の枝の取り出し MutableTreeNode[] kids = new MutableTreeNode[mute.getChildCount()]; int i = 0; Enumeration enum = mute.children(); while( enum.hasMoreElements() ) kids[i++] = (MutableTreeNode)enum.nextElement(); for( i = 0; i < kids.length; i++ ) mute.remove( kids[i] ); // 交換する枝の兄弟の枝の取り出し // 最初に、自分を親から外しておく parent.remove( mute ); MutableTreeNode[] bros = new MutableTreeNode[parent.getChildCount()]; i = 0; enum = parent.children(); while( enum.hasMoreElements() ) bros[i++] = (MutableTreeNode)enum.nextElement(); for( i = 0; i < bros.length; i++ ) parent.remove( bros[i] ); // 子供の枝の交換 for( i = 0; i < kids.length; i++ ) parent.add( (MutableTreeNode)kids[i] ); for( i = 0; i < bros.length; i++ ) mute.add( (MutableTreeNode)bros[i] ); // 親と自分を交換 // 親がrootである場合、親を自分の子供に追加して、自分をrootに設定 if( parent.isRoot() ) { mute.add( parent ); ( (DefaultTreeModel)model ).setRoot( mute ); } // 親の親を取り出して、親を自分の子供に追加して、自分を親の親の子供に追加 else { DefaultMutableTreeNode grandp = ( DefaultMutableTreeNode )parent.getParent(); mute.add( parent ); grandp.add( mute ); } // モデルに変更を反映 ( (DefaultTreeModel)model ).reload(); } }