JTreeで指定ディレクトリ階層下をツリー表示してみる
JTreeの勉強のため、指定ディレクトリ階層下をツリー表示させてみます。
require 'java' %w[JFrame JTree].each {|c| eval c+"=javax.swing."+c } TreeNode = javax.swing.tree.DefaultMutableTreeNode def tree_walk(path="./", node=nil) unless node node = TreeNode.new path end dir = Dir::entries path dir.delete_if {|d| d == "." or d == ".." } dir.each do |d| node_d = TreeNode.new d node.add node_d if FileTest::directory? path_d = File.join(path,d) tree_walk path_d, node_d end end node end root = tree_walk("c:/work") frame = JFrame.new "Tree Viewer" frame.default_close_operation = JFrame::EXIT_ON_CLOSE tree = JTree.new root tree.add_tree_selection_listener do |e| puts "選択 " puts e.path end tree.add_tree_will_expand_listener do |e| puts "展開 " puts e.path end frame.content_pane.add tree frame.set_size 400,300 frame.location_relative_to = nil frame.visible = true
実行結果はこんな感じです。
tree.add_tree_selection_listener do |e| puts e.path end
この記述で、選択したツリーのノードのパスを表示してくれます。
tree.add_tree_will_expand_listener do |e|   puts e.path end
この記述で、展開もしくは折り畳みしたツリーのノードのパスを表示してくれます。
もし、展開と折り畳みのイベントを分けるのであれば、以下のように記述すればよいようです。
def treeWillExpand event puts "Expand: " end def treeWillCollapse event puts "Collapse: " end tree.add_tree_will_expand_listener self
難点なのは、"c:windows"とは表示しようとするとものすごく時間がかかってしまうことです。
これは、ツリー生成時に指定ディレクトリ階層下すべてをみようとしてしまうためです。
改良の余地ありです。
とりあえず、ここまで。