0

0

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

黄舟

黄舟

发布时间:2016-12-20 13:39:45

|

2516人浏览过

|

来源于php中文网

原创

我想您一定对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)! 

善美购物商城Sunway Shop
善美购物商城Sunway Shop

系统特点:技术领先:系统基于被广泛使用的Windows平台开发,集百家之所长,技术领先、功能完备; 快速建店:只需简单设置,3分钟即可以建立一个功能完备的网上商城; 操作简便:软件操作界面由专业设计人员设计,采用人性化的布局,界面规范,操作简捷; 安装方便:只需传到您的虚拟空间即可; HTML编辑器:内置优秀的HTML在线编辑器; 可扩展性:软件构架灵活,考虑未来功能扩充之需要,具有较强的可扩展性

下载

相关文章

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

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

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

18

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

34

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 45.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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