import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; import java.awt.event.*; import java.awt.*; JFrame browser( startingUrl ) { invoke( method, args ) {} windowClosing(WindowEvent we) { we.getWindow().setVisible(false); } setPage( url ) { try { pane.setPage( url ); } catch(Exception e) { statusBar.setText("Error opening page: "+url); } } hyperlinkUpdate( HyperlinkEvent he ) { type = he.getEventType(); if (type == HyperlinkEvent.EventType.ENTERED) { pane.setCursor( Cursor.getPredefinedCursor( Cursor.HAND_CURSOR) ); statusBar.setText(he.getURL().toString()); } else if (type == HyperlinkEvent.EventType.EXITED) { pane.setCursor( Cursor.getDefaultCursor() ); statusBar.setText(" "); } else { setPage( he.getURL() ); if (urlField != null) urlField.setText(he.getURL().toString()); } } frame = new JFrame("Browser"); frame.setSize(400,300); frame.addWindowListener( this ); urlPanel = new JPanel(); urlPanel.setLayout(new BorderLayout()); urlField = new JTextField(startingUrl); urlPanel.add(new JLabel("Site: "), BorderLayout.WEST); urlPanel.add(urlField, BorderLayout.CENTER); statusBar = new JLabel(" "); pane = new JEditorPane(); pane.setEditable(false); setPage( startingUrl ); jsp = new JScrollPane(pane); frame.getContentPane().add(jsp, BorderLayout.CENTER); frame.getContentPane().add(urlPanel, BorderLayout.SOUTH); frame.getContentPane().add(statusBar, BorderLayout.NORTH); // This is the equivalent of an inner class in bsh. urlTextHandler() { actionPerformed(ActionEvent ae) { setPage( ae.getActionCommand() ); } return this; } urlField.addActionListener( urlTextHandler() ); pane.addHyperlinkListener( (HyperlinkListener)this ); return frame; } browser = browser("http://java.sun.com/"); browser.show();