import javax.swing.*; import java.awt.*; import java.net.URL; import java.net.MalformedURLException; import java.io.*; import javax.swing.text.*; import javax.swing.event.*; public class ProjectsPage extends JInternalFrame { public ProjectsPage() { super("Projects Page", true, true, true, true); setFrameIcon( (Icon)UIManager.get("Tree.openIcon")); setBounds( 20, 20, 300, 600); setResizable( false ); PPHtmlPane html = new PPHtmlPane(); setContentPane(html); } } class PPHtmlPane extends JScrollPane implements HyperlinkListener { JEditorPane html; public PPHtmlPane() { try { File f = new File ("HelpFiles/Projects.htm"); String s = f.getAbsolutePath(); s = "file:"+s; URL url = new URL(s); html = new JEditorPane(s); html.setEditable(false); html.addHyperlinkListener(this); JViewport vp = getViewport(); vp.add(html); } catch (MalformedURLException e) { System.out.println("Malformed URL: " + e); } catch (IOException e) { System.out.println("IOException: " + e); } } public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { linkActivated(e.getURL()); } } protected void linkActivated(URL u) { Cursor c = html.getCursor(); Cursor waitCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); html.setCursor(waitCursor); SwingUtilities.invokeLater(new PageLoader(u, c)); } class PageLoader implements Runnable { PageLoader(URL u, Cursor c) { url = u; cursor = c; } public void run() { if (url == null) { html.setCursor(cursor); Container parent = html.getParent(); parent.repaint(); } else { Document doc = html.getDocument(); try { html.setPage(url); } catch (IOException ioe) { html.setDocument(doc); getToolkit().beep(); } finally { url = null; SwingUtilities.invokeLater(this); } } } URL url; Cursor cursor; } }