Java Swing 组件如何显示嵌套了svg的html?

问题描述

我用的是JavaSwing的JEditorPane组件,但是它只能显示html文件,如果嵌套了svg文件,那么svg文件那块就会显示问号,不能显示出来。如果是显示纯svg文件的话我也有办法,现在的问题就是如何在swing组件中显示嵌套了svg文件的html文件。能有什么办法解决这个问题吗? 谢谢!

解决方案

家里网络访问不了sourceforge的网站……。不然很想尝试在swing中嵌入浏览器哪个djproject,看看是否支持svg。我用JEditorPane时,使用底层的一些api,可以访问内嵌svg的html文件了。思想如下:使用HttpConnection访问url(JEditorPane底层也是这样访问url的)获取响应内容,然后提取embed、object中包含svg文件的标签,做特殊处理,处理步骤如下:1.先通过svg的地址获取的资源路径,然后使用batik处理svg,转换为jpg格式的图片2.将该jpg图片保存到一台图片服务器中(tomcat也可),并返回jpg路径3.将原html内容中的embed、object中包含svg文件的标签内容替换为img标签,并把jpg路径放到src属性上4.把新的html响应内容使用JEditorPane底层的解析类处理代码如下(写的比较粗糙,主要是使用HTMLDocument、Parser 、ParserCallback这几个底层的类):import java.awt.BorderLayout;import java.io.BufferedReader;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import java.io.StringReader;import java.net.URL;import javax.swing.JEditorPane;import javax.swing.JFrame;import javax.swing.text.html.HTMLEditorKit.Parser;import javax.swing.text.html.HTMLEditorKit.ParserCallback;import javax.swing.text.html.HTMLDocument;import org.apache.batik.transcoder.TranscoderInput;import org.apache.batik.transcoder.TranscoderOutput;import org.apache.batik.transcoder.image.JPEGTranscoder;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;public class TestJEditorPane extends JFrame {/** * */private static final long serialVersionUID = 7429079353774653739L;/** * @param args */public static void main(String[] args) throws Exception {testJEditorPane();}public static void testJEditorPane() throws Exception {JFrame frame = new JFrame();frame.setTitle("Test");URL url = new URL("http://localhost:8889/springwork/user/login.do");Reader HTMLReader = new InputStreamReader(url.openConnection().getInputStream());BufferedReader br = new BufferedReader(HTMLReader);String line = "";String jpg = "";StringBuffer sb = new StringBuffer();while((line = br.readLine()) != null) {if(line.indexOf("embed") != -1) {String contextPath = url.getProtocol() + "://" + url.getHost() + ":" + url.getPort() + "/" + getAttribute(line, "src");System.out.println(contextPath);jpg = getImagePath(contextPath);line = "<img src="" + jpg + ""/>";} sb.append(line);sb.append("n");}System.out.println(sb.toString());JEditorPane jp = new JEditorPane();try {jp.setSize(400, 300);jp.setPage(url);} catch (IOException e) {e.printStackTrace();} HTMLDocument hdoc = (HTMLDocument) jp.getDocument(); Parser p = hdoc.getParser(); ParserCallback receiver = hdoc.getReader(0); Boolean ignoreCharset = (Boolean)jp.getDocument().getProperty("IgnoreCharsetDirective"); p.parse(new StringReader(sb.toString()), receiver, (ignoreCharset == null) ? false : ignoreCharset.booleanValue()); receiver.flush(); frame.getContentPane().add(jp, BorderLayout.CENTER);frame.setSize(400, 300);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocationRelativeTo(null);frame.pack();frame.repaint();frame.setVisible(true);}public static String getImagePath(String svgUrl) {try {JPEGTranscoder t = new JPEGTranscoder();t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.8));//String svgURI = new File("C:/Users/Administrator/Desktop/svg/asf-logo.svg").toURL().toString();String svgURI = "http://localhost:8889//springwork/styles/svgs/a_1.svg";TranscoderInput input = new TranscoderInput(svgURI);String outPath = "D:/work/eclipse/eclipse4.2/code/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/springwork/styles/svgs/a_1.jpg";FileOutputStream ostream = new FileOutputStream(outPath);TranscoderOutput output = new TranscoderOutput(ostream);t.transcode(input, output);ostream.flush();ostream.close();outPath = "http://localhost:8888/springwork/styles/svgs/a_1.jpg";//相对路径,依据具体的图片服务器地址return outPath;} catch (Exception e) {e.printStackTrace();return "";}} public static Document parseText(String str) throws Exception { Document document = null; try { document = DocumentHelper.parseText(str); } catch(DocumentException de) { throw de; } catch(Exception e) { throw e; } return document; } public static String getAttribute(String str, String name) { try { Document doc = parseText(str); Element ele = doc.getRootElement(); return ele.attributeValue("src"); } catch(Exception e) { return ""; } }}
解决方案二:
你应该在Swing中嵌浏览器而不是JEditorPane,一般浏览器都是对svg支持得比较好的。Swing嵌浏览器你可以参考http://djproject.sourceforge.net/ns/。
解决方案三:
stackoverflow 有几篇 不知道你看过了吗http://stackoverflow.com/questions/9353744/jeditorpane-external-resources-arent-resolvedhttp://stackoverflow.com/questions/9361779/jeditorpane-html-layout-brokenhttp://stackoverflow.com/questions/16073740/cant-show-html-svg
解决方案四:
本身swing整合html就不稳定(比如说里面各种复杂的标签等等)再加上个svg,表示压力很大。如果真要做,我觉得可以重新实现JEditorPane里面的若干方法。JEditorPane肯定也是解析html来显示的,那么你把这部分代码加上svg解析功能,再在pane上描绘出来,应该就能实现了
解决方案五:
不清楚iframe 里面可以用不、你测试下。 < src ="rect.svg" width ="300" height ="100" > </ iframe >

时间: 2024-11-08 19:39:02

Java Swing 组件如何显示嵌套了svg的html?的相关文章

java swing组件拖动和显示问题

问题描述 java swing组件拖动和显示问题 两个问题(1)做出来的窗体组件运行后点击"添加"按钮,应该再窗体上生成一个JLabel标签,点击后能够生成但显示不出来,改变窗体大小才能显示出来.(2)生成的JLabel能够改变大小和拖动,先拖动到另一个位置,改变窗体大小后,又回到原来的位置去了.求大神知道下. 看了以前的帖子@raistlic说是重绘问题,但是按帖子方法把setVisible放在添加控件后面不起作用.使用getContentPane()invalidate.()总是提

java swing 组件 图形-java swing组件上绘制直线同时添加组件后 的显示问题

问题描述 java swing组件上绘制直线同时添加组件后 的显示问题 说明:运行后,面板上自动画出14条直线,点击"添加"按钮,生成可以拖动的JTextField控件.问题(1)面板的背景色不显示,(2)拖动JTextField控件时有残影,(3)改变JFrame大小后,残影消失,但是只能显示JTextField控件的一部分.哪位高手指点下. import java.awt.*; import java.awt.event.*; import java.awt.Graphics; i

Java swing组件的串行化和读取

由于JButton和JTree都已经实现了Serializable接口,因此Java swing组件 的串行化和读取是可以做到的. 方法就是使用ObjectInputStream读取文件中的对象,使用 ObjectOutputStream把对象写入文件. 如: import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I

java swing组件代码问题

问题描述 java swing组件代码问题 private void setupToolBar(){ toolBar = new JToolBar(); JButton button = null; addTool(toolBar,startAction); addTool(toolBar,stopAction); getContentPane().add(toolBar, BorderLayout.NORTH); } public void addTool(JToolBar toolBar,A

Java Swing组件全演示

一 抛砖引玉 本文指在利用一个小程序"Swing 组件大全"来引导大家学习Java这门语言,熟悉Java Swing的各个组件.并在学习过程中参考作者设计这一程序的方法和思想,最终形成自己的思维方式和学习方式.你能举一返三是作者最开心的事情.小程序演示了Java Swing大部分组件.最后附上了全部代码及详细的注释说明.希望本文能对大家学习Java有所帮助. 随着Java风潮席卷国内,学习Java的方法和路径越来越多.而在大量的书本前,在Java庞大的类库前大大家都有点迷失方向的感觉,

java的setlayout(null),选项卡组件不显示

问题描述 java的setlayout(null),选项卡组件不显示 我这里有一个继承jpanel的类 其中setlayout(null),我添加了一个跑马灯的组件和一个选项卡组件,并且我都用了setbounds,可是我的跑马灯能够正常显示而选项卡不能显示如果把setlayout删除则跑马灯和选项卡都能显示出来,可是这时候的位置是固定的无法进行修改我把代码拷贝一下请大神们修改一下,谢谢 package gui.logon; import gui.frame.SystemFrame; import

Java Swing中的工具栏(JToolBar)和分割面版(JSplitPane)组件使用案例_java

一:工具栏(JToolBar) 代码示例: 复制代码 代码如下: import javax.swing.*; //工具栏的使用案例 public class JToolBarDemo2_jigloo extends javax.swing.JFrame {  private JToolBar myJToolBar;  private JButton jB_file;  private JButton jB_edit;  private JButton jB_tools;  private JBu

java用什么组件可以显示一个网页形式文件

问题描述 java用什么组件可以显示一个网页形式文件,用来做帮助的.新手 解决方案 解决方案二:JEditPane呵呵解决方案三:引用1楼amdgaming的回复: JEditPane呵呵 顶解决方案四:具体怎么做呢解决方案五:JEditorPane看API创建一个对象之后showPage()就可以了当然要想自定义更多功能看看API或者百度下解决方案六:学习-解决方案七:importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;im

qq-关于java自定义swing组件的问题

问题描述 关于java自定义swing组件的问题 最近想用纯java写一个小程序,就是点击按钮将输入框的文字输出在上方的消息输出框,消息显示的样式就是类似于QQ聊天时的样子,把消息显示类似在QQ气泡上面 解决方案 JAVA Swing自定义JScorllPanel如何给Swing里组件自定义边框用Java Swing实现的自定义日历组件