利用Java Swing建设一个XML编辑器
当前位置:以往代写 > JAVA 教程 >利用Java Swing建设一个XML编辑器
2019-06-14

利用Java Swing建设一个XML编辑器

利用Java Swing建设一个XML编辑器

副标题#e#

我想您必然对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) 工具。


#p#副标题#e#

结构函数

public XTree( String text )

#p#分页标题#e#

这个结构函数通过利用传送到结构器中的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()

#p#副标题#e#

/**

* 这个要领回收一个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("\n") && !data.equals("\r\n") && data.length() > 0 )
{
treeNode.add(createTreeNode(node));
} file://end if ( !data.equals("\n") && !data.equals("\r\n") && data.length() > 0 )
} file://end if( data != null )
} file://end if( node != null )
} file://end for (int i=0; i < numChildren; i++)
} file://end if( children != null )
} file://end if( root.hasChildNodes() )
return treeNode;
} file://end createTreeNode( Node root )

#p#副标题#e#

/**

* 这个要领,被createTreeNode()用来接洽一个字符串和某一种范例的节点。

*

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

*

* @返回值 返回显示节点类的字符串

*/

#p#分页标题#e#

private String getNodeType( Node node )
{
String type;
switch( node.getNodeType() )
{
case Node.ELEMENT_NODE:
{
type = "Element";
break;
}
case Node.ATTRIBUTE_NODE:
{
type = "Attribute";
break;
}
case Node.TEXT_NODE:
{
type = "Text";
break;
}
case Node.CDATA_SECTION_NODE:
{
type = "CData section";
break;
}
case Node.ENTITY_REFERENCE_NODE:
{
type = "Entity reference";
break;
}
case Node.ENTITY_NODE:
{
type = "Entity";
break;
}
case Node.PROCESSING_INSTRUCTION_NODE:
{
type = "Processing instruction";
break;
}
case Node.COMMENT_NODE:
{
type = "Comment";
break;
}
case Node.DOCUMENT_NODE:
{
type = "Document";
break;
}
case Node.DOCUMENT_TYPE_NODE:
{
type = "Document type";
break;
}
case Node.DOCUMENT_FRAGMENT_NODE:
{
type = "Document fragment";
break;
}
case Node.NOTATION_NODE:
{
type = "Notation";
break;
}
default:
{
type = "???";
break;
}
}// 竣事 switch( node.getNodeType() )
return type;
} file://竣事 getNodeType()

#p#副标题#e#

/**

* 这个要领,用来阐明XML文本字符串,它返回Node范例的工具,可以或许被传送到createTreeNode()要领中。

*

* @参数 text 一个显示XML文档的字符串

* @返回值 返回一个org.w3c.Node.Node工具

*/

private Node parseXml( String text )
{
ByteArrayInputStream byteStream;
byteStream = new ByteArrayInputStream( text.getBytes() );
try
{
doc = db.parse( byteStream );
}
catch ( Exception e )
{
e.printStackTrace();
System.exit(0);
}
return ( Node )doc.getDocumentElement();
} file://竣事 parseXml()
} file://竣事 class XTree

代码2 XTreeTester.java

import javax.xml.parsers.*;
// GUI类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
file://尺度 Java类
import java.io.*;
public class XTreeTester extends JFrame
{
// XTree工具,用来在JTree中显示XML
private XTree xTree;
// JScrollPane是JTree的容器
private JScrollPane jScroll;
private WindowListener winClosing;
// 配置框架的宽和高
private static final int FRAME_WIDTH = 400;
private static final int FRAME_HEIGHT = 300;

#p#副标题#e#

/*

* 结构器结构一个框架包括JScrollPane,

* 把一个基于XML字符串的XTree工具传到结构函数中

*/

public XTreeTester( String title, String xml ) throws ParserConfigurationException
{
super( title );
Toolkit toolkit;
Dimension dim, minimumSize;
int screenHeight, screenWidth;
// 初始化根基的机关属性
setBackground( Color.lightGray );
getContentPane().setLayout( new BorderLayout() );
toolkit = Toolkit.getDefaultToolkit();
dim = toolkit.getScreenSize();
screenHeight = dim.height;
screenWidth = dim.width;
setBounds( (screenWidth-FRAME_WIDTH)/2, (screenHeight-FRAME_HEIGHT)/2, FRAME_WIDTH, FRAME_HEIGHT );
// 构建XTree工具
xTree = new XTree( xml );
file://把XTree封装到JScroll中,以便在JFrame可以使它在屏幕中上下转动.
jScroll = new JScrollPane();
jScroll.getViewport().add( xTree );
// 添加转动条到框架中
getContentPane().add( jScroll, BorderLayout.CENTER );
validate();
setVisible(true);
// 添加WindowListener用来封锁窗口
winClosing = new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
exit();
}
};
addWindowListener(winClosing);
}

#p#副标题#e#

// 措施从这里开始执行。必需把一个以xml为扩展名的XML文件传送到这个要领中,其名目为java XTreeTester yourxmlfilename.xml

#p#分页标题#e#

public static void main( String[] args )
{
String fileName = "";
BufferedReader reader;
String line;
StringBuffer xmlText;
XTreeTester xTreeTester;
// 建设一个基于特定XML文件的文档工具
try
{
if( args.length > 0 )
{
fileName = args[0];
if ( fileName.substring( fileName.indexOf( '.' ) ).equals( ".xml" ) )
{
reader = new BufferedReader( new FileReader( fileName ) );
xmlText = new StringBuffer();
while ( ( line = reader.readLine() ) != null )
{
xmlText.append( line );
}
// 阐明完文档工具后将重写文件
reader.close();
// 结构 GUI 组件
xTreeTester = new XTreeTester( "XTree 测试", xmlText.toString() );
}
else
{
help();
}
}
else
{
help();
}
}
catch( FileNotFoundException fnfEx )
{
System.out.println( "没有发明"+ fileName + "文件。" );
exit();
}
catch( Exception ex )
{
ex.printStackTrace();
exit();
}
}

file://辅佐信息

private static void help()
{
System.out.println( "\n利用要领:java XTreeTester yourxmlfilename.xml" );
System.exit(0);
}
// 退出
private static void exit()
{
System.out.println( "\n感谢利用 XTree" );
System.exit(0);
}
}

    关键字:

在线提交作业