TreeSelectionListenerをためす

戻る

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: TreeSelectionListener.html,v 1.1 2009/06/22 16:12:02 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() );

        }
    }
}
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.tree.*;

/**
$Id: TreeSelectionListener.html,v 1.1 2009/06/22 16:12:02 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() );
        }
    }
}
import java.util.*;

import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;

/**
$Id: TreeSelectionListener.html,v 1.1 2009/06/22 16:12:02 kishi Exp kishi $ 
@author KISHI Yasuhiro
*/

public class TreeRenderer extends JFrame implements ActionListener {

    /** 各ノードの名前を変更するための入力フィールド */
    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() {

        // 初期値をセット
        DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode( "root" );

        treeModel = new DefaultTreeModel( rootTreeNode );
        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" );

        // 未使用
        label = new JLabel();

        // 追加ボタン・削除ボタンをパネルに追加
        JPanel commandPanel = new JPanel();
        commandPanel.add( AddButton );
        commandPanel.add( delButton );
        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() );
            }

        }
    }
}







戻る inserted by FC2 system