Java/Swing JFC/Help

Материал из Java эксперт
Перейти к: навигация, поиск

Simple Help Frame based on JFC JEditorPane

   <source lang="java">

/*

* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002.
* All rights reserved. Software written by Ian F. Darwin and others.
* $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS""
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* 
* Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee
* cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s,
* pioneering role in inventing and promulgating (and standardizing) the Java 
* language and environment is gratefully acknowledged.
* 
* The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for
* inventing predecessor languages C and C++ is also gratefully acknowledged.
*/

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Cursor; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.swing.BorderFactory; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; import javax.swing.text.Document; /**

* Simple Help Frame based on JFC JEditorPane.
*

* May someday rewrite using JavaHelp API. * * @version $Id: SimpleHelp.java,v 1.10 2003/05/30 13:16:07 ian Exp $ */ public class SimpleHelp extends JFrame implements HyperlinkListener { /** The contentpane */ protected Container cp; /** The editorpane */ JEditorPane help; /* * Construct a Help object. Just construct a JEditorPane with a URL, and it * does all the help from there. */ public SimpleHelp(String windowName, String helpIndexFileName) { super(windowName + " Help Window"); cp = getContentPane(); getAccessibleContext().setAccessibleName(windowName + " Help Window"); getAccessibleContext().setAccessibleDescription( "A window for viewing the help for " + windowName + ", which is somewhat hyperlinked."); try { URL url = new File(helpIndexFileName).toURL(); // Only create the window once. if (help == null) { // System.out.println("Creat-ing help window for " + url); help = new JEditorPane(url); // System.out.println("Done!"); help.setEditable(false); help.addHyperlinkListener(this); JScrollPane scroller = new JScrollPane(); scroller.setBorder(BorderFactory.createTitledBorder(windowName + " Help")); scroller.getViewport().add(help); cp.add(BorderLayout.CENTER, scroller); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { SimpleHelp.this.setVisible(false); SimpleHelp.this.dispose(); } }); setSize(500, 400); } else { System.out.println("Re-using help window!"); } } catch (MalformedURLException e) { System.out.println("Malformed URL: " + e); } catch (IOException e) { System.out.println("IOException: " + e); } } /** * Notification of a change relative to a hyperlink. From: * java.swing.event.HyperlinkListener */ public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { URL target = e.getURL(); // System.out.println("linkto: " + target); // Get the help panel"s cursor and the wait cursor Cursor oldCursor = help.getCursor(); Cursor waitCursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR); help.setCursor(waitCursor); // Now arrange for the page to get loaded asynchronously, // and the cursor to be set back to what it was. SwingUtilities.invokeLater(new PageLoader(target, oldCursor)); } } /** * Inner class that loads a URL synchronously into the help panel. Loads it * later than the request so that a cursor change can be done at the very * end. * * @author BORROWED FROM SUN"S SWING DEMO, UNTIL JAVAHELP AVAILABLE */ class PageLoader implements Runnable { URL url; Cursor cursor; PageLoader(URL u, Cursor c) { url = u; cursor = c; } public void run() { // System.out.println("PageLoader: u=" + url); if (url == null) { // restore the original cursor help.setCursor(cursor); // PENDING(prinz) remove this hack when // automatic validation is activated. Container parent = help.getParent(); parent.repaint(); } else { Document doc = help.getDocument(); try { help.setPage(url); } catch (Exception ioe) { help.setDocument(doc); getToolkit().beep(); } finally { // schedule the cursor to revert after // the paint has happended. url = null; SwingUtilities.invokeLater(this); } } } } } </source>