PeterMmm
PeterMmm

Reputation: 24630

Printing from JEditorPane

(I rewrite the original question. The problem is the same.)

The above example code do not print the image. It appears in the window but not printed.

public static void main(String[] args)  {

        final JEditorPane ed = new JEditorPane(
                "text/html",
                "<p>Test<br><img  src='http://www.google.es/images/logos/ps_logo2.png'></p>");

        JFrame f = new JFrame();
        f.setLayout(new BorderLayout());
        f.add(ed);

        JButton b = new JButton("Print");
        f.add(b,BorderLayout.SOUTH);
        b.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent ae) {
                try {
                    ed.print();
                } catch (PrinterException ex) {
                    System.err.println(ex);
                }
            }
        });

        f.pack();
        f.setVisible(true);
    }

Upvotes: 2

Views: 4613

Answers (2)

PeterMmm
PeterMmm

Reputation: 24630

Got this now. The "secret" is to intercept the image loading process and indicate that images should be loaded synchronously.

ed.setEditorKit(new HTMLEditorKit() {

            @Override
            public ViewFactory getViewFactory() {
                return new HTMLFactory() {

                    @Override
                    public View create(Element elem) {
                        View view = super.create(elem);
                        if (view instanceof ImageView) {
                            ((ImageView) view).setLoadsSynchronously(true);
                        }
                        return view;
                    }
                };
            }
        });

Upvotes: 5

Amir Afghani
Amir Afghani

Reputation: 38531

Try this:

import java.io.IOException;
import java.net.URL;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.Document;

public class MainClass {

    public static void main(final String args[]) {
        final JFrame frame = new JFrame("EditorPane Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        try {
            final JEditorPane editorPane = new JEditorPane("http://www.google.com");
            editorPane.setEditable(false);

            final HyperlinkListener hyperlinkListener = new ActivatedHyperlinkListener(editorPane);
            editorPane.addHyperlinkListener(hyperlinkListener);

            final JScrollPane scrollPane = new JScrollPane(editorPane);
            frame.add(scrollPane);
        }
        catch (final IOException e) {
            System.err.println("Unable to load: " + e);
        }

        frame.setSize(640, 480);
        frame.setVisible(true);
    }

}

class ActivatedHyperlinkListener
    implements HyperlinkListener {

    JEditorPane editorPane;

    public ActivatedHyperlinkListener(final JEditorPane editorPane) {
        this.editorPane = editorPane;
    }

    public void hyperlinkUpdate(final HyperlinkEvent hyperlinkEvent) {
        final HyperlinkEvent.EventType type = hyperlinkEvent.getEventType();
        final URL url = hyperlinkEvent.getURL();
        if (type == HyperlinkEvent.EventType.ENTERED) {
            System.out.println("URL: " + url);
        }
        else if (type == HyperlinkEvent.EventType.ACTIVATED) {
            System.out.println("Activated");
            final Document doc = this.editorPane.getDocument();
            try {
                this.editorPane.setPage(url);
                this.editorPane.print();
            }
            catch (final Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Upvotes: 0

Related Questions