//: c13:DisplayMethods.java // From Thinking in Java, 2nd Edition // Available at http://www.BruceEckel.com // (c) Bruce Eckel 1999 // Copyright notice in Copyright.txt // Display the methods of any class inside // a window. Dynamically narrows your search. // import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.lang.reflect.*; import java.io.*; public class DisplayMethods extends JApplet { Class cl; Method[] m; Constructor[] ctor; String[] n = new String[0]; JTextField name = new JTextField(40), searchFor = new JTextField(30); JCheckBox strip = new JCheckBox("Strip Qualifiers", true); JTextArea results = new JTextArea(40, 65); class NameL implements ActionListener { public void actionPerformed(ActionEvent e) { String nm = name.getText().trim(); if(nm.length() == 0) { results.setText("No match"); n = new String[0]; return; } try { cl = Class.forName(nm); } catch (ClassNotFoundException ex) { results.setText("No match"); return; } m = cl.getMethods(); ctor = cl.getConstructors(); // Convert to an array of Strings: n = new String[m.length + ctor.length]; for(int i = 0; i < m.length; i++) n[i] = m[i].toString(); for(int i = 0; i < ctor.length; i++) n[i + m.length] = ctor[i].toString(); reDisplay(); } } class StripL implements ItemListener { public void itemStateChanged(ItemEvent e) { reDisplay(); } } class SearchForL implements ActionListener { public void actionPerformed(ActionEvent e) { reDisplay(); } } void reDisplay() { // Create the result set: String[] rs = new String[n.length]; String find = searchFor.getText(); int j = 0; // Select from the list if find exists: for (int i = 0; i < n.length; i++) { if(find == null) rs[j++] = n[i]; else if(n[i].indexOf(find) != -1) rs[j++] = n[i]; } results.setText(""); if(strip.isSelected()) for (int i = 0; i < j; i++) results.append( StripQualifiers.strip(rs[i]) + "\n"); else // Leave qualifiers on for (int i = 0; i < j; i++) results.append(rs[i] + "\n"); } public void init() { name.addActionListener(new NameL()); searchFor.addActionListener(new SearchForL()); strip.addItemListener(new StripL()); JPanel top = new JPanel(), lower = new JPanel(), p = new JPanel(new BorderLayout()); top.add(new JLabel("Qualified class name:")); top.add(name); lower.add( new JLabel("String to search for:")); lower.add(searchFor); lower.add(strip); p.add(top, BorderLayout.NORTH); p.add(lower, BorderLayout.SOUTH); Container cp = getContentPane(); cp.setLayout(new BorderLayout()); cp.add(p, BorderLayout.NORTH); cp.add(results, BorderLayout.CENTER); } public static void main(String[] args) { JApplet applet = new DisplayMethods(); JFrame frame = new JFrame("Display Methods"); frame.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add(applet); frame.setSize(650, 700); applet.init(); applet.start(); frame.setVisible(true); } } class StripQualifiers { private StreamTokenizer st; public StripQualifiers(String qualified) { st = new StreamTokenizer( new StringReader(qualified)); st.ordinaryChar(' '); } public String getNext() { String s = null; try { if(st.nextToken() != StreamTokenizer.TT_EOF) { switch(st.ttype) { case StreamTokenizer.TT_EOL: s = null; break; case StreamTokenizer.TT_NUMBER: s = Double.toString(st.nval); break; case StreamTokenizer.TT_WORD: s = new String(st.sval); break; default: // single character in ttype s = String.valueOf((char)st.ttype); } } } catch(IOException e) { System.out.println(e); } return s; } public static String strip(String qualified) { StripQualifiers sq = new StripQualifiers(qualified); String s = "", si; while((si = sq.getNext()) != null) { int lastDot = si.lastIndexOf('.'); if(lastDot != -1) si = si.substring(lastDot + 1); s += si; } return s; } } ///:~