javax.swing.JTree

目的
ツリーの扱いを知る

関連クラス

今回のソース
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.io.File;
import java.util.Arrays;
import java.util.Vector;

class jtree
{
	public static void main(String args[])
	{
		new FileView();
	}
}

class FileView extends JFrame
{
	// ホームディレクトリの取得
	final String home_directory = System.getProperty("user.home");

	public FileView()
	{
		setTitle("TreeTest");
		setSize(255,255);

		// ウインドウリスナの登録
		WindowListener listener = new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		};
		addWindowListener(listener);

		// ツリーの生成と配置
		DirectoryNode top = new DirectoryNode(home_directory);
		JTree tree = new JTree(top);
		JScrollPane treeview = new JScrollPane(tree);
		getContentPane().add(treeview,BorderLayout.CENTER);

		setVisible(true);
	}
}

class DirectoryNode extends DefaultMutableTreeNode
{
	// ファイルセパレータの取得
	final String separator = System.getProperty("file.separator");

	public DirectoryNode(String root_path)
	{
		super(root_path);
		ProcessFileList(this);
	}

	// ファイルリストの処理
	protected void ProcessFileList(DefaultMutableTreeNode parent_node)
	{
		File directory = new File(parent_node.toString());
		String file_list[] = directory.list();
		file_list = SortFileList(parent_node.toString(),file_list);

		// 子ノードの追加
		for(int i=0;i<file_list.length;i++)
		{
			File file = new File(parent_node.toString() + separator + file_list[i]);
			DefaultMutableTreeNode child_node = new DefaultMutableTreeNode(file.getAbsolutePath());
			parent_node.add(child_node);
			if(file.isDirectory())
			{
				// ディレクトリの場合のみ再帰呼び出し
				ProcessFileList(child_node);
			}
		}
	}

	// ファイルリストのソート
	protected String[] SortFileList(String path,String list[])
	{
		Vector directory_list,file_list;

		directory_list = new Vector();
		file_list = new Vector();

		// ファイルとディレクトリの分別
		for(int i=0;i<list.length;i++)
		{
			File file = new File(path + separator + list[i]);
			if(file.isFile())
			{
				file_list.addElement(new String(list[i]));
			}
			else if(file.isDirectory())
			{
				directory_list.addElement(new String(list[i]));
			}
		}

		// Vector配列→String配列への変換&ソート
		String file_name_list[] = new String[file_list.size()];
		file_list.copyInto(file_name_list);
		Arrays.sort(file_name_list);

		String directory_name_list[] = new String[directory_list.size()];
		directory_list.copyInto(directory_name_list);
		Arrays.sort(directory_name_list);

		// ソート済み配列をコピーする(マージ)
		String return_list[] = new String[list.length];

		for(int i=0;i<directory_name_list.length;i++)
		{
			return_list[i] = directory_name_list[i];
		}

		int offset = directory_name_list.length;
		for(int i=0;i<file_name_list.length;i++)
		{
			return_list[i+offset] = file_name_list[i];
		}

		return(return_list);
	}
}
Source is here. (ZIP Format,1301Byte,Shift-JIS)

コンパイル&実行
javac jtree.java
java jtree

説明
(概略)

ホームディレクトリのファイルを、ツリー形式で表示します。
一応ディレクトリ、ファイルの順に、ソートしましたが、
ディレクトリの下にファイルが無いと、ファイルのアイコンになってしまうのが
ちょっと情けない感じです。

(サンプルプログラムの説明)

ホームディレクトリの取得
実行環境のプロパティを取得します。
100% Pure Javaなアプリケーションを書く場合には不可欠でしょう。
他には、Javaのバージョン(java.version)やOS名(os.name)や
OSのバージョン(os.version)などを取得することも出来ます。
DirectoryNode top = new DirectoryNode(home_directory);
DirectoryNodeクラスは、ツリー中のディレクトリを表します。
与えられたディレクトリを元に、サブディレクトリを探索し、
自動的に、ツリーを作り上げます。

最初は、C Driveを表示するという仕様だったのですが、
Windowsだけなので、それはやめまして、
ホームディレクトリを表示するという仕様に決めました。
ちなみに、Windowsのホームディレクトリは、
なぜか、C:\Windowsだそうです(笑)。
JTree tree = new JTree(top);
JScrollPane scrollview = new JScrollPane(tree);
getContentPane().add(scrollview,BorderLayout.CENTER);
JScrollPaneは、スクロールバーをつけるのに使います。
他には、分割フレームを実装させる、JSplitPaneや
タブビューを実装させる、JTabbedPaneがあります。
Paneとは、タイトルバーとメニューなどを除いた部分を指しているのだと思います。
つまり、アプリケーションの見た目を形成する部分ですね。
File file = new File(parent_node.toString() + separator + file_list[i]);
絶対パスを取得するために、親ノード(ディレクトリ)名と、
ファイルセパレータと、ファイル名を連結しています。
ディレクトリの場合のみ再帰呼び出し
これはいわゆる、深さ優先検索法です。
ファイルリストの中に、ディレクトリが見つかった場合、
メソッドの再帰呼び出しをして、さらにそのディレクトリの
ファイルリストを得て、中身を調べます。
あとは、ファイルのみのディレクトリに到達したら、
一階層上の次のファイルを検索という風にして、
ホームディレクトリのすべてのファイルを検索しています。
Arrays.sort(file_name_list);
JDK1.2から加えられた、ソート(整列)メソッドです。
このメソッドを実行するには、ソート対象となるオブジェクトに、
Comparable(比較)インターフェースが実装されていなければなりません。
当然並べ替えるのに、比較の操作が必要になってきますよね。
Stringクラスには、デフォルトで実装されています。