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() );
}
}
}
}
戻る