`
leo428
  • 浏览: 14458 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在Java Swing中显示HTML网页,并能响应链接(转帖)

阅读更多
如果做过Java Swing开发的人应该知道,可以应用HTML标签来给控件增色,如

view plaincopy to clipboardprint?
//必须用<html>和</html>包起来  
JLabel label = new JLable("<html><font color=red size=3>RED</font></html>"); 
//必须用<html>和</html>包起来
JLabel label = new JLable("<html><font color=red size=3>RED</font></html>");
如果是完整一个HTML格式文件在Java Swing中应该如何显示出来呢?那就要用到强劲的编辑器控件JEditPane了。JEditorPane是Swing中一款非常强大的文本编辑控件,在JEditorPane中,我们完全可以将HTML文件或RTF格式的文件直接显示出来,但是它还不能完整地支持HTML的所有标准。支持 HTML3.2标准的语法,对CSS和JavaScript就支持的不好,请掂量着使用CSS和JavaScript某些特性。

如果仅仅在JEditPane中显示网页,代码非常简单,只需以下四行代码:

view plaincopy to clipboardprint?
JEditorPane editorPane = new JEditorPane();  
String path = "http://unmi.blogcn.com";  
editorPane.setEditable(false);     //请把editorPane设置为只读,不然显示就不整齐  
editorPane.setPage(path); 
  JEditorPane editorPane = new JEditorPane();
  String path = "http://unmi.blogcn.com";
  editorPane.setEditable(false);     //请把editorPane设置为只读,不然显示就不整齐
  editorPane.setPage(path);
这时候,网页虽然是显示出来了,可是你会发现点击网页上的超链接没反应,要使JEditorPane能够响应点击链接的事件,我们要为JEditorPane添加超链接的监听器:

view plaincopy to clipboardprint?
editorPane.addHyperlinkListener(this);    //让我们的主体类实现了HyperlinkListener接口 
editorPane.addHyperlinkListener(this);    //让我们的主体类实现了HyperlinkListener接口
HyperlinkListener接口的实现方法参照后面的完整代码

view plaincopy to clipboardprint?
package com.unmi;  
import java.awt.BorderLayout;  
import java.awt.Container;  
import java.io.IOException;  
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.html.HTMLDocument;  
import javax.swing.text.html.HTMLFrameHyperlinkEvent;  
public class HTMLView extends JFrame implements HyperlinkListener  
{  
   public HTMLView() throws Exception  
   {  
      setSize(640, 480);      setTitle("隔叶黄莺:The Blog of Unmi");  
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
      JEditorPane editorPane = new JEditorPane();  
        
      //放到滚动窗格中才能滚动查看所有内容  
      JScrollPane scrollPane = new JScrollPane(editorPane);  
      //设置是显示网页 html 文件,可选项  
      //editorPane.setContentType("text/html");  
      //设置成只读,如果是可编辑,你会看到显示的样子也是不一样的,true显示界面  
      editorPane.setEditable(false);  
      //要能响应网页中的链接,则必须加上超链监听器  
      editorPane.addHyperlinkListener(this);  
      String path = "http://unmi.blogcn.com";  
      try 
      {  
         editorPane.setPage(path);  
      }  
      catch (IOException e)  
      {  
         System.out.println("读取页面 " + path + " 出错. " + e.getMessage());  
      }  
      Container container = getContentPane();  
        
      //让editorPane总是填满整个窗体  
      container.add(scrollPane, BorderLayout.CENTER);  
   }  
   //超链监听器,处理对超级链接的点击事件,但对按钮的点击还捕获不到  
   public void hyperlinkUpdate(HyperlinkEvent e)  
   {  
      if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)  
      {  
         JEditorPane pane = (JEditorPane) e.getSource();  
         if (e instanceof HTMLFrameHyperlinkEvent)  
         {  
            HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;  
            HTMLDocument doc = (HTMLDocument) pane.getDocument();  
            doc.processHTMLFrameHyperlinkEvent(evt);  
         }  
         else 
         {  
            try 
            {  
               pane.setPage(e.getURL());  
            }  
            catch (Throwable t)  
            {  
               t.printStackTrace();  
            }  
         }  
      }  
   }  
     
   public static void main(String[] args) throws Exception  
   {  
      JFrame frame = new HTMLView();  
      frame.setVisible(true);  
   }  

package com.unmi;
import java.awt.BorderLayout;
import java.awt.Container;
import java.io.IOException;
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.html.HTMLDocument;
import javax.swing.text.html.HTMLFrameHyperlinkEvent;
public class HTMLView extends JFrame implements HyperlinkListener
{
   public HTMLView() throws Exception
   {
      setSize(640, 480);      setTitle("隔叶黄莺:The Blog of Unmi");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      JEditorPane editorPane = new JEditorPane();
     
      //放到滚动窗格中才能滚动查看所有内容
      JScrollPane scrollPane = new JScrollPane(editorPane);
      //设置是显示网页 html 文件,可选项
      //editorPane.setContentType("text/html");
      //设置成只读,如果是可编辑,你会看到显示的样子也是不一样的,true显示界面
      editorPane.setEditable(false);
      //要能响应网页中的链接,则必须加上超链监听器
      editorPane.addHyperlinkListener(this);
      String path = "http://unmi.blogcn.com";
      try
      {
         editorPane.setPage(path);
      }
      catch (IOException e)
      {
         System.out.println("读取页面 " + path + " 出错. " + e.getMessage());
      }
      Container container = getContentPane();
     
      //让editorPane总是填满整个窗体
      container.add(scrollPane, BorderLayout.CENTER);
   }
   //超链监听器,处理对超级链接的点击事件,但对按钮的点击还捕获不到
   public void hyperlinkUpdate(HyperlinkEvent e)
   {
      if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
      {
         JEditorPane pane = (JEditorPane) e.getSource();
         if (e instanceof HTMLFrameHyperlinkEvent)
         {
            HTMLFrameHyperlinkEvent evt = (HTMLFrameHyperlinkEvent) e;
            HTMLDocument doc = (HTMLDocument) pane.getDocument();
            doc.processHTMLFrameHyperlinkEvent(evt);
         }
         else
         {
            try
            {
               pane.setPage(e.getURL());
            }
            catch (Throwable t)
            {
               t.printStackTrace();
            }
         }
      }
   }
  
   public static void main(String[] args) throws Exception
   {
      JFrame frame = new HTMLView();
      frame.setVisible(true);
   }
}
JEditorPane有两个重载的setPage方法,一个是setPage(String path),另一个是setPage(URL url)。你可以有多种方式获取要显示的HTML的path或url。

例如,对于显示本地系统上的HTML文件,可以用如下方式(为什么一定转成AbsolutePath,而不能直接 editorPane.setPage("c:\\test.html")我还没有搞清,反正直接editorPane.setPage("c: \\test.html")页面显示不出来)

view plaincopy to clipboardprint?
File file = new File("c:/test.html");  
String path = file.getAbsolutePath();   
editorPane.setPage(path); 
File file = new File("c:/test.html");
String path = file.getAbsolutePath();
editorPane.setPage(path);
也可以通过类加载器得当相对于Classpath下的资源(HTML文件)的URL,方法如下:

view plaincopy to clipboardprint?
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();  
URL url = urlLoader.findResource("doc/help.htm");//可以用html格式文件做你的帮助系统了  
EditorPane.setPage(url);  
URLClassLoader urlLoader = (URLClassLoader)this.getClass().getClassLoader();
URL url = urlLoader.findResource("doc/help.htm");//可以用html格式文件做你的帮助系统了
EditorPane.setPage(url); 
另外:对于editorPane还可以用它的setText(content)来设置要显示的内容,content是以<body></body>包裹起来的,如

view plaincopy to clipboardprint?
editorPane.setText("<body><a href='http://unmi.blogcn.com'>隔叶黄莺:The Blog of Unmi</a></body>"); 
editorPane.setText("<body><a href='http://unmi.blogcn.com'>隔叶黄莺:The Blog of Unmi</a></body>");
借于以上方法,你可以读取到网页的内容,然后取<body>部分(含Body标签),显示到editorPane上,不过这样做也真的是多此一举啦,而且还是出力不讨好的,想想在body之外还定义了一些样式表或更多内容就那样被抛弃了,具体这种用法的代码就不写出来了。

显示的网页如下图:


由上图可以看出来,HTML中的TextBox、ComboBox、RadioButton、Button等控件都被Swing JEditorPane转换成风格的相应控件来显示了,另外还注意到图中的"数据读取中"本该是要处理替换的,可是怎么也出不来,也就是 JEditorPane对JavaScript得不到很好的支持,同时也能看到有些显示样式还不错,也有许多地方的显示风格与在IE中相差较远,由此,JEditorPane也是不能很好的支持样式表。

参考:1. 跟我学Java Swing之游戏设计(4)
       2. http://java.vkfz.com/Java-t191539.htm
       3. Eclipse 3.0 简介和插件开发示例



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/casularm/archive/2009/01/18/3826324.aspx


分享到:
评论

相关推荐

    java swing界面显示IE网页

    java swing GUI界面显示IE网页 根据网址跳转到相应网站

    Java 实现swing中嵌入html 实例 适合新手

    在Java编程中,Swing库提供了丰富的组件来创建桌面应用程序,但默认情况下它不支持直接显示HTML内容。然而,通过引入第三方库,如DJ Native Swing,我们可以实现在Swing应用中嵌入HTML的功能,这对于创建复杂的用户...

    Swing显示Html网页

    Swing显示HTML网页是Java开发GUI应用程序时的一个常见需求,主要涉及到Java的Swing库以及相关的第三方库,如JDIC(Java Desktop Integration Components)。本文将详细介绍如何在Swing界面中集成HTML网页显示功能。 ...

    JAVA swing中文离线API文档

    Java Swing是Java标准库中的一个组件集合,用于构建桌面应用程序用户界面。它是Java Foundation Classes (JFC)的一部分,提供了一套轻量级的GUI(图形用户界面)组件,支持丰富的交互功能。本离线API文档详细阐述了...

    java浏览器+swing嵌套网页+源码免费

    1. **创建Swing组件**:首先,创建一个`JFrame`作为主窗口,然后在其中添加一个可以显示网页的组件,如`JEditorPane`或自定义的`JWebPane`替代。 2. **加载网页内容**:使用`setPage`方法加载URL指定的网页,或者...

    Java Swing实现添加数据并查询数据显示

    首先,你需要了解如何在Java中连接MySQL数据库。这通常涉及到使用JDBC(Java Database Connectivity),它是Java标准API,允许Java程序与各种数据库进行通信。你需要在项目中引入MySQL的JDBC驱动,例如`mysql-...

    java swing漂亮界面(超酷) javaswing教程

    Swing还支持布局管理器,如FlowLayout、BorderLayout、GridLayout和CardLayout,它们能帮助开发者合理地组织和排列组件,确保界面在不同屏幕尺寸下都能保持良好的显示效果。此外,通过自定义布局或者使用...

    java swing漂亮界面 超酷 javaswing教程

    在“Java Swing漂亮界面 超酷 JavaSwing教程”中,我们主要会探讨如何利用Swing来设计美观且用户友好的界面。Swing组件的一大优点是它们是轻量级的,这意味着它们完全由Java代码实现,而不是依赖于操作系统提供的...

    Java Swing 中文Api

    在Java 2 Platform Standard Edition 5.0版本中,Swing提供了丰富的组件和功能,使得开发者能够创建美观且功能强大的桌面应用程序。这份"Java Swing 中文Api"文档是针对中国开发者设计的,它提供了详细的中文解释,...

    java swing实现pdf阅读器

    在Java中处理PDF文件,我们通常需要借助于如Apache PDFBox、iText或PDFJava等第三方库。 首先,要实现PDF阅读器,我们需要能够读取PDF文件。Apache PDFBox是Apache软件基金会的一个项目,提供了一系列API用于读取、...

    用Java程序读取Excel表格内容并显示在Swing中

    在Java编程环境中,读取Excel表格内容并将其展示在Swing界面是一项常见的任务,尤其在数据处理和报表展示方面。本篇文章将详细讲解如何实现这一功能。 首先,我们需要引入两个关键库:Apache POI用于读取Excel文件...

    java Swing读取图片

    当我们需要在Swing应用中展示图片时,可以利用特定的方法来读取并显示图像。本篇文章将详细讲解如何在Java Swing中读取和显示图片,以及与之相关的知识点。 首先,我们需要了解Java中的图像处理类。`java.awt.Image...

    基于java swing实现答题系统

    在Java中,事件处理是指对用户交互的响应。我们使用了ActionListener和KeyListener来处理用户的交互事件。在本文中,我们使用了ActionListener来处理按钮的点击事件,而KeyListener用于处理键盘输入事件。 三、...

    java浏览器+swing嵌套网页+源码

    在本项目中,Swing被用来创建一个容器,该容器可以加载和显示网页内容。 Swing中的`JEditorPane`或`JWebPane`通常用于嵌入网页。`JEditorPane`是一个可以显示和编辑多种类型文本内容的组件,其中包括HTML。然而,...

    java swing串口通信源码

    在Java中,我们可以使用`javax.comm`库(或第三方库如RXTX)来处理串口操作。然而,`javax.comm`库并不包含在标准Java SDK中,因此需要单独下载并添加到项目类路径。 在Java Swing中建立串口通信,我们需要以下步骤...

    javaSwing皮肤大全.rar

    在Java Swing中,LookAndFeel是一种设计模式,用于实现组件的绘制方式,包括颜色、字体、布局和动画效果。 标题“javaSwing皮肤大全.rar”表明这是一个包含多种Swing LookAndFeel皮肤的压缩文件集合。这个压缩包...

    java+swing漂亮软件界面+超酷+以及javaswing教程.7z

    在Java中,Swing提供了丰富的组件集,允许开发者创建美观且功能强大的桌面应用程序。"java+swing漂亮软件界面+超酷+以及javaswing教程.7z"这个压缩包文件显然包含了关于如何利用Java Swing创建出吸引人的、具有超酷...

    java实验报告———JavaSwing编程.pdf

    标题中提到的“JavaSwing编程”,指的是在Java编程语言中,使用Swing库进行图形用户界面(GUI)编程的一种实践。Swing是Java的一个工具包,用于开发Java应用程序的图形用户界面。它提供了一套丰富的组件,可以让...

Global site tag (gtag.js) - Google Analytics