Creating a Windowed Browser

We wrote the indenting parser example to store the display text in an array named displayStrings , so it's easy to display that text in a Java window as we did in the previous chapter. To do that, I'll create a new example named ch12_05.java. In this program, I'll create a new object of a class that I'll call AppFrame , and I'll pass displayStrings and the number of lines to display to the AppFrame class's constructor. Then I'll call the AppFrame object's show method to show the window:

 import java.awt.*;  import java.awt.event.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.*; import java.io.*; public class ch12_05 extends DefaultHandler {     .     .     .     public static void main(String args[])     {        ch12_05 obj = new ch12_05();        obj.displayDocument(args[0]);  AppFrame f = new AppFrame(displayStrings, numberDisplayLines);   f.setSize(300, 500);   f.addWindowListener(new WindowAdapter() {public void   windowClosing(WindowEvent e) {System.exit(0);}});   f.show();  } } 

The AppFrame class is based on the Java Frame class, and it displays the text we've passed to it:

 class AppFrame extends Frame  {     String displayStrings[];     int numberDisplayLines;     public AppFrame(String[] d, int n)     {         displayStrings = d;         numberDisplayLines = n;     }     public void paint(Graphics g)     {         Font font;         font = new Font("Courier", Font.PLAIN, 12);         g.setFont(font);         FontMetrics fontmetrics = g.getFontMetrics(getFont());         int y = fontmetrics.getHeight();         for(int index = 0; index < numberDisplayLines; index++){             y += fontmetrics.getHeight();             g.drawString(displayStrings[index], 5, y);         }     } } 

You can see this new application at work in Figure 12-3, where ch12_01.xml is displayed in a Java window.

Figure 12-3. A window-based browser using a SAX parser.

graphics/12fig03.gif

Here's the code for this example:

Listing ch12_05.java
 import java.awt.*; import java.awt.event.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.*; import java.io.*; public class ch12_05 extends DefaultHandler {     static String displayStrings[] = new String[1000];     static int numberDisplayLines = 0;     static String indent = "";     public void displayDocument(String uri)     {         DefaultHandler handler = this;         SAXParserFactory factory = SAXParserFactory.newInstance();         try {             SAXParser saxParser = factory.newSAXParser();             saxParser.parse(new File(uri), handler);         } catch (Throwable t) {}     }     public void processingInstruction(String target, String data)     {         displayStrings[numberDisplayLines] = indent;         displayStrings[numberDisplayLines] += "<?";         displayStrings[numberDisplayLines] += target;         if (data != null && data.length() > 0) {             displayStrings[numberDisplayLines] += ' ';             displayStrings[numberDisplayLines] += data;         }         displayStrings[numberDisplayLines] += "?>";         numberDisplayLines++;     }     public void startDocument()     {         displayStrings[numberDisplayLines] = indent;         displayStrings[numberDisplayLines] += "<?xml version=\"1.0\" encoding=\""+             "UTF-8" + "\"?>";         numberDisplayLines++;     }     public void startElement(String uri, String localName, String qualifiedName,         Attributes attributes)     {         displayStrings[numberDisplayLines] = indent;         indent += "    ";         displayStrings[numberDisplayLines] += '<';         displayStrings[numberDisplayLines] += qualifiedName;         if (attributes != null) {             int numberAttributes = attributes.getLength();             for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) {                 displayStrings[numberDisplayLines] += ' ';                 displayStrings[numberDisplayLines] += attributes.getLocalName(loopIndex);                 displayStrings[numberDisplayLines] += "=\"";                 displayStrings[numberDisplayLines] += attributes.getValue(loopIndex);                 displayStrings[numberDisplayLines] += '"';             }         }         displayStrings[numberDisplayLines] += '>';         numberDisplayLines++;     }     public void characters(char characters[], int start, int length)     {         String characterData = (new String(characters, start, length)).trim();         if(characterData.indexOf("\n") < 0 && characterData.length() > 0) {             displayStrings[numberDisplayLines] = indent;             displayStrings[numberDisplayLines] += characterData;             numberDisplayLines++;         }     }     public void ignorableWhitespace(char characters[], int start, int length)     {         //characters(characters, start, length);     }     public void endElement(String uri, String localName, String qualifiedName)     {         indent = indent.substring(0, indent.length() - 4);         displayStrings[numberDisplayLines] = indent;         displayStrings[numberDisplayLines] += "</";         displayStrings[numberDisplayLines] += qualifiedName;         displayStrings[numberDisplayLines] += '>';         numberDisplayLines++;     }     public void warning(SAXParseException exception)     {         System.err.println("WARNING! " +             exception.getMessage());     }     public void error(SAXParseException exception)     {         System.err.println("ERROR! " +             exception.getMessage());     }     public void fatalError(SAXParseException exception)     {         System.err.println("FATAL ERROR! " +             exception.getMessage());     }     public static void main(String args[])     {        ch12_05 obj = new ch12_05();        obj.displayDocument(args[0]);        AppFrame f = new AppFrame(displayStrings, numberDisplayLines);        f.setSize(300, 500);        f.addWindowListener(new WindowAdapter() {public void            windowClosing(WindowEvent e) {System.exit(0);}});        f.show();     } } class AppFrame extends Frame {     String displayStrings[];     int numberDisplayLines;     public AppFrame(String[] d, int n)     {         displayStrings = d;         numberDisplayLines = n;     }     public void paint(Graphics g)     {         Font font;         font = new Font("Courier", Font.PLAIN, 12);         g.setFont(font);         FontMetrics fontmetrics = g.getFontMetrics(getFont());         int y = fontmetrics.getHeight();         for(int index = 0; index < numberDisplayLines; index++){             y += fontmetrics.getHeight();             g.drawString(displayStrings[index], 5, y);         }     } } 

Now that we're parsing and displaying XML documents in windows , there's no reason to restrict ourselves to displaying the text form of an XML document, just as we did in the previous chapter. But this time, we'll use the SAX parser. Take a look at the next section.



Real World XML
Real World XML (2nd Edition)
ISBN: 0735712867
EAN: 2147483647
Year: 2005
Pages: 440
Authors: Steve Holzner

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net