jruby で swing
Drag 可能な JTree を java で作成し、それを jruby から使ってみた。
Drag 可能な JTree の例は以下にある。
- http://terai.xrea.jp/Swing/DnDTree.html
> JTreeのノードをドラッグ&ドロップ - Java Swing Tips
このソースから、DnDTree クラスだけを抜き出したものをつくり、
DnDTree.jar をつくっておく。
java ソースのすべては引用しないが、
ヘッダ部だけを示す(jar の作り方などをコメント追加したので)
$ cat DnDTree.java
// See
// http://terai.xrea.jp/Swing/DnDTree.html
// javac -d . -encoding utf8 -target 1.5 DndTree.java
// jar cvf DnDTree.jar samples
package samples;
//-*- mode:java; encoding:utf8n; coding:utf-8 -*-
// vim:set fileencoding=utf-8:
//http://terai.xrea.jp/Swing/DnDTree.html
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.io.*;
import javax.swing.*;
import javax.swing.tree.*;
//Java Swing Hacks - HACK #26: DnD JTree
//http://www.oreilly.co.jp/books/4873112788/
public class DnDTree extends JTree implements DragSourceListener, DropTargetListener, DragGestureListener {
private static final String NAME = "TREE-TEST";
... 省略 ...
$ cat dndtree.rb
# See http://www.bloglines.com/blog/ThomasEEnebo?id=40
require 'pp'
require 'java'
require 'DnDTree.jar'
import 'samples.DnDTree'
import javax.swing.JFrame
import javax.swing.tree.DefaultMutableTreeNode
import javax.swing.tree.DefaultTreeModel
def getTreeData(v)
root = DefaultMutableTreeNode.new("Root")
DefaultTreeModel.new(vec2tree(root, v))
end
def vec2tree(parent, h)
h.each do |k, v|
if v.kind_of? Hash
child = DefaultMutableTreeNode.new(k)
parent.add(vec2tree(child, v))
else
parent.add(DefaultMutableTreeNode.new(k))
end
end
parent
end
frame = JFrame.new "Dragable JTree"
frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
frame.set_size(600, 400)
content = frame.content_pane
content.setLayout(java.awt.BorderLayout.new)
# ツリー
hash = { :A => nil, :B => {:B1 => nil, :B2 => nil}, :C => nil }
tree = DnDTree.new
tree.model = getTreeData(hash)
content.add(tree, java.awt.BorderLayout::CENTER)
frame.visible = true
ここでは、Hash を Tree 表示させてみているが、Array、XML の Dom などいろいろなものを Tree 表示させるように変更するのは簡単だ。
xmlunit の diff 情報を tree 表示にうまく反映させるはどんな風にすればよいだろうか?
最近のコメント