There are three advanced swing components that should be used: JEditorPane, JScrollPane and JTable. Also, the swing class HTML that parses web pages will play a major role.
These are the imports you'll probably use.
import java.io.* ; import java.awt.* ; import java.awt.event.* ; import java.net.* ; import javax.swing.* ; import javax.swing.event.* ; import javax.swing.text.html.* ; import javax.swing.text.* ;
In a big project, it's often a good idea to start with a prototype, i.e. a program that looks like the complete program but lacks most of the functionality. In this case the prototype should show a
JFrame with three components: a text field at the top, a
JEditorPane in the center and a
JTable to the right. All without contents. The table should have 50 lines and two columns, so it will not fit in the window. Put the table inside a scrolling box, for instance with the following code:
JScrollPane links=new JScrollPane(new JTable(50,2));It's also best to place the web browser (the center component) in a scroll pane as well, since the entire page won't fit the window.
Run the program and check that it's possible to write text in all three components. This is an accidental feature (bug?) as far as the web page and link table components are concerned, but the text field is there to let the user type in the web address to go to. When the user presses Enter, the
ActionListener for the text field is triggered. It's possible to let the Netscrape class itself be a listener and do a call like
browser.showPage(...) when the event is triggered.
Your task is now to write a class
WebBrowser which extends
JEditorPane and has a method
showPage(address). This method actually only needs the single statement
but the compiler needs this to be wrapped in a
catch to handle the cases when the page can't be found etc.
When this happens, the user should be alerted of the error by a dialog box. This component is called
JOptionPane. Look up its usage in the Java documentation (hint: the first parameter should be
When the class is done, Netscrape can do
WebBrowser browser = new WebBrowser();.
When you try your web browser out you will be annoyed by the fact that the browser does nothing when you click the links. This is not necessary to fix to pass the lab assignment, but counts as an extra assignment. Two things will have to be done: you have to call
setEditable(false) for your browser object to stop the click from being interpreted as a "start editing"-action. Also, you need to add a
HyperlinkListener. The details of this is described in lecture 7.
getURL().toString() for a
HyperlinkEvent returns a web address which can be used in the address bar.
So, write a class
Surfer which inherits from
WebBrowser and takes (and saves) a reference to the address bar as a parameter in its constructor. Just writing the address to the address bar is not enough, however. You also need to generate an event by callin
postActionEvent() for the address bar. When the class is ready, Netscrape can do
WebBrowser browser = new Surfer(addressBar);
Leave the Netscrape class for a while and write a new program that outputs all links on a web page. It can be called WebCheck and consist of, at least for now, just a main-method. A web page can be printed with the following code
String webbsida="http://www.nada.kth.se/~henrik" ; InputStream in=new URL(webbsida).openConnection().getInputStream(); InputStreamReader reader= new InputStreamReader(in) ; while(reader.ready()) System.out.print((char)reader.read()) ;The compiler requires a
catchsince the connection might fail. Instead of reading the input stream, you can create an empty
HTMLDocumentand let a
HTMLEditorKitread the web page into it by
doc.putProperty("IgnoreCharsetDirective", Boolean.TRUE) ; new HTMLEditorKit().read(reader,doc,0) ;(Without the first statement you'll get a ChangedCharSetException on all swedish sites that explicitly state the character set as iso-8859-1.)
An HTML page consists of different kinds of tags. The tag used for links is called
A and has an attribute
HREF which has the web address of the link as value. Your task is to iterate through the document from A-tag to A-tag, read the HREF attribute and print its value. To do this, create a Tag.A iterator and a HREF attribute object. Then let the iterator step forward in a while loop. Print the HREF attribute inside the loop.
Once this works, change the program to also output the text between the A-tag and its closing tag by using
Instead of printing links and link text, WebCheck should now add them in a JTable, which Netscrape retrieves with the call
links=new JScrollPane(WebbCheck.linkTable(addressBar.getText())) ;So, your code should be moved from the main method to a method linkTable. This method can start by putting the links and link texts into a 50x2 String matrix and then creating a JTable from that and a two element caption vector. Remember that you can set the background to something nice before returning the JTable.
While you are testing the program, it might be a good idea to have a main method in WebCheck that calls linkTable, puts the table in a JFrame and shows it. Once this works, you can be sure that Netscrape too will show the table properly. The problem is how to get rid of the old table before adding the new one. One way is to first call
remove(links), and then create a new JScrollPane
links before adding it in the right part of the browser as before.
Finally, you can go web smurfing among the links to celebrate that the last prutt assignment is done.