views:

135

answers:

3

I am trying to create a help panel for an application I am working on. The help file as already been created using html technology and I would like it to be rendered in a pane and shown. All the code I have seen shows how to render a site e.g. "http://google.com". I want to render a file from my pc e.g. "file://c:\tutorial.html"

This is the code i have, but it doesn't seem to be working.

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import java.awt.Color;
import java.awt.Container;
import java.io.IOException;

import static java.lang.System.err;
import static java.lang.System.out;

    final class TestHTMLRendering
        {
        // ------------------------------ CONSTANTS ------------------------------

        /**
         * height of frame in pixels
         */
        private static final int height = 1000;

        /**
         * width of frame in pixels
         */
        private static final int width = 1000;

        private static final String RELEASE_DATE = "2007-10-04";

        /**
         * title for frame
         */
        private static final String TITLE_STRING = "HTML Rendering";

        /**
         * URL of page we want to display
         */
        private static final String URL = "file://C:\\print.html";

        /**
         * program version
         */
        private static final String VERSION_STRING = "1.0";

        // --------------------------- main() method ---------------------------

        /**
         * Debugging harness for a JFrame
         *
         * @param args command line arguments are ignored.
         */
        @SuppressWarnings( { "UnusedParameters" } )
        public static void main( String args[] )
            {
            // Invoke the run method on the Swing event dispatch thread
            // Sun now recommends you call ALL your GUI methods on the Swing
            // event thread, even the initial setup.
            // Could also use invokeAndWait and catch exceptions
            SwingUtilities.invokeLater( new Runnable()
            {
            /**
             * } fire up a JFrame on the Swing thread
             */
            public void run()
                {
                out.println( "Starting" );
                final JFrame jframe =
                        new JFrame( TITLE_STRING + " " + VERSION_STRING );
                Container contentPane = jframe.getContentPane();
                jframe.setSize( width, height );

                contentPane.setBackground( Color.YELLOW );
                contentPane.setForeground( Color.BLUE );
                jframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                try
                    {
                    out.println( "acquiring URL" );
                    JEditorPane jep = new JEditorPane( URL );
                    out.println( "URL acquired" );
                    JScrollPane jsp =
                            new JScrollPane( jep,
                                    JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
                    contentPane.add( jsp );
                    }
                catch ( IOException e )
                    {
                    err.println( "can't find URL" );
                    contentPane.add( new JLabel( "can't find URL" ) );
                    }
                jframe.validate();
                jframe.setVisible( true );
                // Shows page, with HTML comments erroneously displayed.
                // The links are not clickable.
                }
            } );
            }// end main
        }// end TestHTMLRendering
+2  A: 

Rendering HTML in Swing is problematic. Swing components have some native support for HTML but it's not even HTML4. It's (limited!) HTML 3.2. If you use a different desktop library API you'll have much better options

You may also want to look at Flying Saucer, which is:

An XML/XHTML/CSS 2.1 Renderer

(in 100% Java)

cletus
+1  A: 

What @cletus says is all true. If you want to get your current app going though with a file-based URL, try setting:

URL = "file:///C://print.html"
Ash
That's not the issue. He notes that the page displays, just with incorrect rendering (e.g. comments displayed as text).
Matthew Flaschen
I believe he asked how to get a file-based URL working. I ran the code with the original URL and it didn't work, so I fixed the URL...
Ash
i read the question 3 times, and i guess the problem is the URL not the rendering itself.
medopal
Its rendering it now, but it doesn't seem to be coming out properly. I see some boxes been created and its not properly formatted. Any help ?
ferronrsmith
That's what @cletus is saying in his answer: the standard Swing components aren't capable of rendering anything much more than very simple HTML. (If only we had a JWebPane component or something...)
Ash
A: 

You forgot to set the content type of the JEditorPane.

jep.setContentType("text/html");
suihock
thanks. I also needed to set the editable property, thanks.<br />jep.setContentType( "text/html" );<br />jep.setEditable( false );
ferronrsmith