首页 > Java > java教程 > 正文

使用Java Swing 创建一个XML编辑器(一)

黄舟
发布: 2016-12-20 13:39:45
原创
2428人浏览过

我想您一定对xml有所了解,说不定您现在还跃跃欲试想写一段xml文本呢,可是现在能找到的跨平台的、免费的xml编辑器太少了。所以在本文中,我想介绍一下或者说带您一步一步的开发一个简单的xml编辑器,当然我们要用到一些最常见的java 2 swing组件,不过这些都是免费的,有些是jdk中的,有些是可以从网上下载的。我想通过本文,你就可以创建一个属于你自己的xml编辑器。 
 

  先让我介绍一下本文辑写的思路。首先我想简要的讨论一下xml和为什么树型结构比较适合用来显示xml,然后我们来看一看jaxp api如何建立所需要的xml类的环境;然后我们将了解用来显示一个图形树的jtree swing组件;最后,我们将创建一个继续jtree组件的可以重复使用的类,可以用来分析一个xml文档,并把数据显示在一个jtree中。

  说到xml(extensible markup languge),人们往往把它当成是一种新的用于web浏览器中的标记语言,就象html或css一样。其实,xml是一种数据表示语言,它答应你使用一种非常有效的方法来描述你的数据。xml能够使你定义诸如“these three words constitutes a heading”这样的语句。xml答应你声明任何类型的数据,而不是用来把这些数据显示在网页中。

  请看一看下面的xml实例:

<article>
<header>
<title> 使用java swing 创建一个xml编辑器
<subtitle> 第一部分</subtitle>
</title>
<author> wayne </author>
<header>
<content> 这是正文</content>
</article>

  请注重,这些元素和标准的html语句是不同的,但是它们看上去比较象html,这是因为xml和html都是来源于sgml语言。不同的是html有预定义的标签集,而xml的语法则有许多灵活性,它答应你使用表意的标记如<author>来括在数据两边。你还要注重,所有的元素都从属于根元素(上例中为<article>),有些元素则还有自己的子元素,如<subtitle>就是<title>的子元素。这样的数据组织方式有三个好处:数据能够更加表意,数据更加易维护而且数据更加轻易作为一个树的结构表现出来,这就是我们为什么使用jtree对象来显示xml数据的原因。假如你想对xml有更深的了解,请参阅天极网上的相关教程。

  jaxp是一个用于处理xml的java api,它能够使应用程序分析并且转化xml文档,它的功能有点象jdbc api,都是把函数功能抽象成一个个方法。你可以去apache网站找到最新的xerces分析器,其中含有最新的jaxp,下载下来以后把它放在你的类目录中。

下面让我们看一下如何使用jtree swing组件。

  我们都知道,在自然界中,一棵树通常都有一个非常粗的树干,树干上有许多树枝分叉。每个树杈和树杈之间都有一定的联系,因为它们都有同一个来源:树干。这种继续的关系并不只在树枝中有,人类谱系也遵循相同的规律。从父母,到子女再到子女的子女,就这样直到数不清为止。同样,在数据存储中,树的概念也是一种使用同人类家谱树一样方法储存数据的方法。树的每一个树杈称为一个节点,每个有子节点的节点称为父节点,所有的子节点的公共的父节点被称为根节点。一个jtree组件就是一个简单的树数据结构的可视化表现形式。

  几乎所有的xml编辑器都包括一个可视化的树结构,能让你编辑xml文档中的元素。我们马上就会构建一个编辑器,不过在此之前,先让我们再了解一下jtree组件。一个节点在一棵树的某个位置储存数据,为了存储数据,必须知道任何一个父节点和它们的子节点。javax.swing.tree包定义了一些非常有用的接口,提供了一种通用的方法构建和操作一个树结构。

  treenode方法,用于访问树的节点的信息

  mutabletreenode方法 用在一个可变的树上(能够添加或删除子节点)

  treemodel方法 用于创建和治理与树有关的数据模型。

  接下来,我们将创建一个继续jtree的类,提供分析xml文档和用可视化jtree组件把节点显示出来的功能。

  创建xtree组件

  xtree类由一个构造函数和三个方法组成,为了简单起见我们的组件只能构建一个xtree,在树创建好之后不能进行处理它的节点。下面让我们来看一个这个类。

  域:

  private defaultmutabletreenode treenode 这个成员变量储存treenode对象用于存储jtree的模型。 

  defaultmutabletreenode类是在javax.swing.tree中被定义的,默认提供了mutabletreenode接口的一个实现。

  private documentbuilderfactory dbf

  private documentbuilder db

  private document doc 这三个成员变量是jaxp的一部分,用来分析xml文本并转化成dom(document object model) 对象。

  构造函数

  public xtree( string text )

  这个构造函数通过使用传送到构造器中的xml文本创建一个xtree对象。在初始化一些与jtree超类和dom分析对象有关的基本显示属性后,构造函数生成一个treemodel 对象用来创建一个实际可视的树。通过把dom对象传送到createtreenode()方法来创建一个根节点,createtreenode()方法返回一个defaultmutabletreenode类型的对象。这个对象然后被用来创建树的treemodel。

  方法

   private defaultmutabletreenode createtreenode( node root )

  这个方法采用一个dom 节点,然后在子节点中递归直到所有的接点都被添加到defaultmutabletreenode中。这是一个递归方法,为了找到根节点下的每一个子节点,它每次都要调用自己。jtree然后就可以使用defaultmutabletreenode对象了,因为它已经是树型了。

   private string getnodetype( node node )

  这个方法,被createtreenode()用来联系一个字符串和某一种类型的节点。

   private node parsexml()

  这个方法,用来分析xml文本字符串,它返回node类型的对象,能够被传送到createtreenode()方法中。

下面我给出了java代码,供大家分析研究。

// 到入w3c的dom 类
import org.w3c.dom.*;
// jaxp的用于dom i/o的类
import javax.xml.parsers.*;
// 标准java类
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class xtree extends jtree
{
/**
* 这个成员变量储存treenode对象用于存储jtree的模型。
*defaultmutabletreenode类是在javax.swing.tree中被定义的
*默认提供了mutabletreenode接口的一个实现。
*/
private defaultmutabletreenode treenode;
/**
* 这三个成员变量是jaxp的一部分,用来分析xml文本并转化成dom(document object model) 对象。
*/
private documentbuilderfactory dbf;
private documentbuilder db;
private document doc;

 /**
 * 这个构造函数通过使用传送到构造器中的xml文本创建一个xtree对象

 * @参数 text是一个xml格式的xml文本

 * @异常 parserconfigurationexception 假如构造函数非正常的设置分析器,就会抛出异常

 */

public xtree( string text ) throws parserconfigurationexception
{
super();

// 设置tree渲染的基本属性
getselectionmodel().setselectionmode( treeselectionmodel.single_tree_selection );
setshowsroothandles( true );
seteditable( false ); // 答应树可以编辑

// 通过初始化对象的dom来分析对象
dbf = documentbuilderfactory.newinstance();
dbf.setvalidating( false );
db = dbf.newdocumentbuilder();

// 采用dom根节点并且把它转化成jtree的树模型
treenode = createtreenode( parsexml( text ) );
setmodel( new defaulttreemodel( treenode ) );
} file://中止xtree()

  /**

  * 这个方法采用一个dom 节点,然后在子节点中递归直到所有的接点都被添加到defaultmutabletreenode中。

  * 这是一个递归方法,为了找到根节点下的每一个子节点,它每次都要调用自己。

  * jtree然后就可以使用defaultmutabletreenode对象了,因为它已经是树型了。

  *

  * @参数 root org.w3c.node.node

  *

  * @返回值 返回一个基于根节点defaultmutabletreenode对象

  */

private defaultmutabletreenode createtreenode( node root )
{
defaultmutabletreenode treenode = null;
string type, name, value;
namednodemap attribs;
node attribnode;

// 从根节点中取得数据
type = getnodetype( root );
name = root.getnodename();
value = root.getnodevalue();

treenode = new defaultmutabletreenode( root.getnodetype() == node.text_node ? value : name );

// 显示属性
attribs = root.getattributes();
if( attribs != null )
{
for( int i = 0; i < attribs.getlength(); i++ )
{
attribnode = attribs.item(i);
name = attribnode.getnodename().trim();
value = attribnode.getnodevalue().trim();

if ( value != null )
{
if ( value.length() > 0 )
{
treenode.add( new defaultmutabletreenode( "[attribute] --> " + name + "="" + value + """ ) );
} file://end if ( value.length() > 0 )
} file://end if ( value != null )
} file://end for( int i = 0; i < attribs.getlength(); i++ )
} file://end if( attribs != null )

// 假如存在子节点,递归
if( root.haschildnodes() )
{
nodelist children;
int numchildren;
node node;
string data;

children = root.getchildnodes();
// 假如子节点非空的话,只递归
if( children != null )
{
numchildren = children.getlength();

for (int i=0; i < numchildren; i++)
{
node = children.item(i);
if( node != null )
{
if( node.getnodetype() == node.element_node )
{
treenode.add( createtreenode(node) );
} file://end if( node.getnodetype() == node.element_node )

data = node.getnodevalue();

if( data != null )
{
data = data.trim();
if ( !data.equals(" ") && !data.equals(" 

 以上就是使用Java Swing 创建一个XML编辑器(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)! 

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号