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"とは表示しようとするとものすごく時間がかかってしまうことです。
これは、ツリー生成時に指定ディレクトリ階層下すべてをみようとしてしまうためです。
改良の余地ありです。

とりあえず、ここまで。