| ホーム > 技術情報 > Javaのクラス情報をJTreeとJTableで表示する | 検索 | 更新情報 |
| Javaの入門書 | 著書 |
ClassViewは、 Javaのクラス情報をJTreeとJTableで表示する簡単なビューアです。 実際にツールとして使うというよりは、 java.swing.JTreeとjava.swing.JTableの小さなサンプルプログラムと考えてください。
コンパイル&実行は、
javac ClassView.java
java ClassView クラス名1 クラス名2 ...
のようにします(J2SE 1.4以降)。
例えば、
java ClassView javax.swing.JFrame
とすると、javax.swing.JFrameが対象になります。
上半分のJTreeにはクラスの階層が表示されます。 マウスでクラス名を選択すると、下半分のJTableには、 クラス名、スーパークラス名、メソッドの一覧 が表示されます。 もっとたくさんの情報を表示してもよかったのですが、 とりあえず以上。
/* ClassView.java */
import java.lang.reflect.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.table.*;
import javax.swing.event.*;
public class ClassView extends JFrame implements TreeSelectionListener {
private static final String ROOT_OBJECT = "java.lang.Object";
private final HashMap _nameToNode = new HashMap();
private final TreeNode _root = createNode(ROOT_OBJECT);
private final JTree _tree = new JTree(new DefaultTreeModel(_root));
private final JTable _table = new JTable();
private final JScrollPane _treePane = new JScrollPane(_tree);
private final JScrollPane _tablePane = new JScrollPane(_table);
public ClassView() {
super("ClassView");
_nameToNode.put(ROOT_OBJECT, _root);
_treePane.setMinimumSize(new Dimension(640, 240));
JSplitPane pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
pane.setTopComponent(_treePane);
pane.setBottomComponent(_tablePane);
pane.setPreferredSize(new Dimension(640, 480));
getContentPane().add(pane, BorderLayout.CENTER);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
_tree.addTreeSelectionListener(this);
pack();
show();
}
public void add(String classname) {
try {
add(Class.forName(classname));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void valueChanged(TreeSelectionEvent e) {
Object[] path = e.getPath().getPath();
if (path != null && path.length > 0) {
String className = path[path.length - 1].toString();
showClassProperty(className);
}
}
public void add(Class cls) {
Vector v = new Vector();
while (cls != null) {
v.insertElementAt(cls.getName(), 0);
cls = cls.getSuperclass();
}
for (int i = 0; i < v.size() - 1; i++) {
String parentName = (String)v.get(i);
String childName = (String)v.get(i + 1);
DefaultMutableTreeNode parentNode = findNode(parentName);
DefaultMutableTreeNode childNode = createNode(childName);
parentNode.add(childNode);
}
repaint();
}
private DefaultMutableTreeNode findNode(String name) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)_nameToNode.get(name);
return node;
}
private DefaultMutableTreeNode createNode(String name) {
DefaultMutableTreeNode node = findNode(name);
if (node == null) {
node = new DefaultMutableTreeNode(name);
_nameToNode.put(name, node);
}
return node;
}
private void showClassProperty(String className) {
DefaultTableModel model = new DefaultTableModel();
model.setColumnCount(2);
_table.setModel(model);
try {
Class cls = Class.forName(className);
Class supercls = cls.getSuperclass();
Method[] methods = cls.getMethods();
showProperty("name", className);
if (supercls != null) {
showProperty("super", supercls.getName());
}
for (int i = 0; i < methods.length; i++) {
showProperty("method #" + (i + 1), methods[i].toString());
}
} catch (Exception e) {
}
_tablePane.repaint();
}
private void showProperty(String propName, String propValue) {
DefaultTableModel model = (DefaultTableModel)_table.getModel();
int row = model.getRowCount();
model.setRowCount(row + 1);
_table.setValueAt(propName, row, 0);
_table.setValueAt(propValue, row, 1);
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("Usage: java ClassView classname ...");
System.out.println("Example: java ClassView javax.swing.JFrame");
}
ClassView view = new ClassView();
for (int i = 0; i < args.length; i++) {
view.add(args[i]);
}
}
}
あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。