import javax.swing.text.html.*; import javax.swing.text.*; import javax.swing.event.*; import javax.swing.*; import java.io.*; import java.awt.*; import java.awt.event.*; import java.util.*; /** A simple Web Browser with minimal functionality. @author Jose M. Vidal */ public class Browser { /** Set the page. @param jep the pane on which to display the url @param url the url to display */ protected static void setPage(JEditorPane jep, String url){ try { jep.setPage(url); } catch (IOException e) { System.err.println(e); System.exit(-1); } } /** An inner class which listens for keypresses on the Back button. */ class backButtonListener implements ActionListener { protected JEditorPane jep; protected JLabel label; protected JButton backButton; protected Vector history; public backButtonListener(JEditorPane jep, JButton backButton, Vector history, JLabel label){ this.jep = jep; this.backButton = backButton; this.history = history; this.label = label; } /** The action is to show the last url in the history. @param e the event*/ public void actionPerformed(ActionEvent e){ try{ //the current page is the last, remove it String curl = (String)history.lastElement(); history.removeElement(curl); curl = (String)history.lastElement(); System.out.println("Back to " + curl); setPage(jep,curl); label.setText("URL: "+ curl); if (history.size() == 1) backButton.setEnabled(false); } catch (Exception ex){ System.out.println("Exception " + ex); } } } /** An inner class that listens for hyperlinkEvent.*/ class LinkFollower implements HyperlinkListener { protected JEditorPane jep; protected JLabel label; protected JButton backButton; protected Vector history; public LinkFollower(JEditorPane jep, JButton backButton, Vector history, JLabel label){ this.jep = jep; this.backButton = backButton; this.history = history; this.label = label; } /** The action is to show the page of the URL the user clicked on. @param evt the event. We only care when its type is ACTIVATED. */ public void hyperlinkUpdate(HyperlinkEvent evt){ if (evt.getEventType() == HyperlinkEvent.EventType.ACTIVATED){ try { String currentURL = evt.getURL().toString(); history.add(currentURL); backButton.setEnabled(true); System.out.println("Going to " + currentURL); setPage(jep,currentURL); label.setText("URL: "+ currentURL); } catch (Exception e) { System.out.println("ERROR: Trouble fetching url"); } } } } /** The contructor runs the browser. It displays the main frame with the fetched initialPage @param initialPage the first page to show */ public Browser(String initialPage){ /** A vector of String containing the past urls */ Vector history = new Vector(); history.add(initialPage); // set up the editor pane JEditorPane jep = new JEditorPane(); jep.setEditable(false); setPage(jep, initialPage); // set up the window JScrollPane scrollPane = new JScrollPane(jep); JFrame f = new JFrame("Simple Web Browser"); f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //Exit the program when user closes window. f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ System.exit(0); } }); //Label where we show the url JLabel label = new JLabel("URL: "+ initialPage); JButton backButton = new JButton ("Back"); backButton.setActionCommand("back"); backButton.setToolTipText("Go to previous page"); backButton.setEnabled(false); backButton.addActionListener(new backButtonListener(jep, backButton, history, label)); JButton exitButton = new JButton ("Exit"); exitButton.setActionCommand("exit"); exitButton.setToolTipText("Quit this application"); exitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); //A toolbar to hold all our buttons JToolBar toolBar = new JToolBar(); toolBar.add(backButton); toolBar.add(exitButton); jep.addHyperlinkListener(new LinkFollower(jep, backButton, history, label)); //Set up the toolbar and scrollbar in the contentpane of the frame JPanel contentPane = (JPanel)f.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.setPreferredSize(new Dimension(400, 100)); contentPane.add(toolBar, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); f.pack(); f.setSize(640, 360); f.setVisible(true); } /** Create a Browser object. Use the command-line url if given */ public static void main(String[] args) { String initialPage = new String("http://www.cse.sc.edu"); if (args.length > 0) initialPage = args[0]; Browser b = new Browser(initialPage); } }