Reputation: 24630
(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
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
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