JTreeを使う

戻る


import java.util.*;

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

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

public class TreeViewer extends JFrame implements ActionListener {

    private JTree tree;
    private JTextField text;
    private JLabel label;
    private DefaultTreeModel treeModel;

    public static void main( String[] args ) {
        /* 自分自身を作成 */
        TreeViewer viewer = new TreeViewer();

        /* 終了処理を追加 */
        viewer.addWindowListener( new WindowAdapter() {
                                      public void windowClosing( WindowEvent e ) {
                                          System.exit( 0 );
                                      }
                                  }
                                );

        /* サイズと位置を指定 */
        viewer.setBounds( 10, 10, 400, 600 );

        /* 実際に表示する */
        viewer.setTitle( "ツリー追加削除の実験" );
        viewer.setVisible( true );
        viewer.pack();
    }

    public TreeViewer() {
        DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode( "root" );

        treeModel = new DefaultTreeModel( rootTreeNode );
        tree = new JTree( treeModel );
        // tree.setBackground( new Color(0x99,0x99,0xff));

        // スクロールするペインを追加
        JScrollPane scrPane = new JScrollPane();
        scrPane.getViewport().setView( tree );
        scrPane.setPreferredSize( new Dimension( 400, 400 ) );

        JPanel panel = new JPanel();
        // panel.setBackground( new Color(0x99,0x66,0xff));
        panel.add( scrPane );

        // ノード追加ボタン
        JButton AddButton = new JButton( "Add" );
        AddButton.addActionListener( this );
        AddButton.setActionCommand( "Add" );

        // ノード削除ボタン
        JButton delButton = new JButton( "Del" );
        delButton.addActionListener( this );
        delButton.setActionCommand( "Del" );

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

        JPanel commandPanel = new JPanel();
        commandPanel.add( AddButton );
        commandPanel.add( delButton );
        commandPanel.add( label );

        // 未使用
        text = new JTextField( 10 );

        Container content = this.getContentPane();
        content.add( text, BorderLayout.NORTH );
        content.add( panel, BorderLayout.CENTER );
        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;
                    if ( node.isRoot() ) {
                        prefix = "child";
                    } else {
                        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() );
            }

        }
    }
}


戻る inserted by FC2 system