ホーム > 技術情報 > 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]); } } }
あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。