首页 > 学院 > 开发设计 > 正文

使用Java Swing创建一个XML编辑器之二

2019-11-18 12:49:19
字体:
来源:转载
供稿:网友

  在本文中,我们将创建我们的xml编辑器的框架,为了达到这个目的,我们将用到许多Swing组件(包括jsplitPane、JscrollPane、Jbutton和JtextArea组件)。
  
  一、问题的提出与解决
  我如何创建一个能够浏览文本和浏览视图的XML文本编辑器呢?创建一个包含Jbutton和JsplitPane的Jframe对象, 然后让JsplitPane对象包含两个JscrollPane对象,一个用于浏览图形(xTree类),另一个用于浏览文本(JtextArea类)。Jbutton用来治理刷新图形浏览的操作。
  
  二、增强Xtree类的功能
  在上一篇文章中,我们开发了Xtree类,这是一个可重用的组件,继续于Jtree类并能够把XML数据以图形树的形式显示。我们现在就增强这个类, 通过提供给它一个在显示默认的XML树来We will now enhance that class by PRoviding it with a default XML
  tree to display in the event that an XML file is not supplied at the command-line. 而且,我们还将添加一些错误处理逻辑以便程序不会因为无效的XML而崩溃。
  
  第一步是创建一个名为buildTree()的方法:
  
  private DefaultTreeModel buildTree( String text )
  
  {
  
   DefaultMutableTreeNode treeNode;
  
   Node newNode;
  
   // 采用DOM根节点并把它转化成为一个Tree模型
  
   newNode = parseXml( text );
  
   if ( newNode != null )
  
   {
  
    treeNode = createTreeNode( newNode );
  
    return new DefaultTreeModel( treeNode );
  
   }
  
   else
  
    return null;
  
   } file&://结束buildTree()
  
  
  这个方法取得传入的 XML字符串,分析这个 XML字符串并构造一个可以用来从数据中构造图形树形结构的DefaultTreeModel变量实例。这个功能原来包含在 XTree()构造程序中,但是我们把它拿出来然后把它放进一个单独的方法中,这样我们就有了创建一个默认图形树的伸缩性。这就是我们接下来想做的事。
  
  接下来一步是创建一个叫 buildWelcomeTree()的方法。这个方法一次构建一个DefaultTreeModel变量,而不是通过分析一个现有的XML文字字符串。假如用户没有指定 XML文件就启动这个应用程序,将显示 DefaultTreeModel。见代码段1
  
  代码段1:
  
  private DefaultTreeModel buildWelcomeTree()
  {
   DefaultMutableTreeNode root;
   DefaultMutableTreeNode instrUCtions, openingDoc,
               editingDoc, savingDoc;
   DefaultMutableTreeNode openingDocText, editingDocText,
               savingDocText;
   DefaultMutableTreeNode development, addingFeatures,
               contactingKyle;
  
   root = new DefaultMutableTreeNode( /"Welcome to XML View 1.0/" );
   instructions = new DefaultMutableTreeNode( /"Instructions/" );
   openingDoc = new DefaultMutableTreeNode
               ( /"Opening XML document./" );
   openingDocText = new DefaultMutableTreeNode
               ( /"When invoking the XmlEditor from
   the command-line, you must specify the filename./" );
   editingDoc = new DefaultMutableTreeNode
               ( /"Editing an XML document." );
   editingDocText = new DefaultMutableTreeNode
               ( /"XML text in the right hand frame
               can be edited directly.
               The //"refresh//" button will rebuild
               the JTree in the left frame./" );
   savingDoc = new DefaultMutableTreeNode
               ( /"Saving an XML document." );
   savingDocText = new DefaultMutableTreeNode
              ( /"This iteration of the XmlEditor does
                not provide the ability to save your
                document. That will come with the
                next article./" );
   root.add( instructions );
   instructions.add( openingDoc );
   instructions.add( editingDoc );
   openingDoc.add( openingDocText );
   editingDoc.add( editingDocText );
   return new DefaultTreeModel( root );
  }
  
  接下来的我们需要添加一个新的构造程序来简化默认显示功能,我们将修改主构造程序,这样它就不能接受任何参数,创建一个新的能接收单一的 XML文本字符串的构造程序。这样以来,假如没有 XML文本被显示的话就会创建默认 XTree对象,而假如 XML文本被显示的话将创建一个唯一的 XTree对象。代码段2中给出了两个构造程序。
  
  代码段2:
  
  public XTree( String text ) throws ParserConfigurationException
  {
   this();
   refresh( text );
   }
  public XTree() throws ParserConfigurationException
  {
   super();
   getSelectionModel().setSelectionMode(
       TreeSelectionModel.SINGLE_TREE_SELECTION );
   setShowsRootHandles( true );
   setEditable( false );
   dbf = document.uilderFactory.newInstance();
   dbf.setValidating( false );
   db = dbf.newdocument.uilder();
   setModel( buildWelcomeTree() );
  }
  
  三、创建 XmlEditor类
  XmlEditor类与前面的那篇文章的XTreeTester类有相同的用途,不同之处在于 XmlEditor包括一个 JTextArea,答应你操作文本版XML。之后,你可以点击 “Refresh”按钮并查看 XTree组件中反映出来的变化。
  
  假如直接修改第一篇文章中的代码,你就能节省很多时间,你可以把 XTreeTester.java文件重命名为 XmlEditor.java (不过一定要修改构造程序 )并把它当成模板文件。
  
  要做的第一件事是添加下列 Swing组件:另一个 JScrollPane、 JSplitPane、 JTextArea和 JButton。通过声明所有的这些组件以及其他组件开始(看代码段3)。
  
  代码段3:
  
  private XTree xTree;
  private JScrollPane jScroll, jScrollRt;
  private JSplitPane splitPane;
  private JButton refreshButton;
  private WindowListener winClosing;
  
  首先,我们将创建并添加“ Refresh”按钮。这个按钮用来指示这个 XTree组件将使用当前 XML文本来刷新。我们还需要使用一个ActionListener来注册它。(参见代码段 4 ) 为了拦截按钮事件,我们需要有这个类还要实现 ActionListener,而且我们还需要创建一个 actionPerformed()方法 (参见代码段 5 )。
  
  代码段4:
  
  refreshButton = new JButton( /"Refresh/" );
  refreshButton.setBorder(
    BorderFactory.createRaisedBevelBorder() );
  refreshButton.addActionListener( this );
  getContentPane().add( refreshButton, BorderLayout.NORTH );
  
  代码段5:
  
  public void actionPerformed( ActionEvent ae )
  {
   if ( ae.getActionCommand().equals( /"Refresh/" ) )
    xTree.refresh( textArea.getText() );
  }
  
  接下来,我们将创建新的 JScrollPane和 JTextArea并且把 JTextArea添加到 JScrollPane中。这样,我们将得到包含 XTree组件的原始的 JScrollPane和包含 JTextArea组件的新的 JScrollPane。这个原始的 XTree构造程序还有一个修改之处。我们将删除先前传进这个方法的字符串参数。(该功能通过我们接下来要构建的另一个 XmlEditor()构造程序操作)我们把这两个方框放进一个 JSplitPane中,它是一个有分隔器的组件,可以在这个分隔器的另一边包含一个组件。(参见代码段6)。
  
  代码段6:
  
  jScroll = new JScrollPane();
  jScrollRt = new JScrollPane();
  
  textArea = new JTextArea( 200,150 );
  jScrollRt.getViewport().add( textArea );
  
  xTree = new XTree();
  xTree.getSelectionModel().setSelectionMode(
     TreeSelectionModel.SINGLE_TREE_SELECTION );
  xTree.setShowsRootHandles( true );
  
  xTree.setEditable( false );
  
  jScroll.getViewport().add( xTree );
  
  splitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT,
     jScroll, jScrollRt );
  splitPane.setOneTouchEXPandable(true);
  splitPane.setDividerLocation(200);
  
  minimumSize = new Dimension(200, 150);
  jScroll.setMinimumSize( minimumSize );
  jScrollRt.setMinimumSize( minimumSize );
  
  splitPane.setPreferredSize( new Dimension(400, 300) );
  
  getContentPane().add( splitPane, BorderLayout.CENTE

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表