這是本系列的第二篇。在上一篇文章中,我們簡要地討論了xml以及為什麼一個樹形結構適合顯示XML、如何處理XML資料、如何使用JTree Swing 元件以及如何建立一個可重用的能夠分析XML文件以及在Jtree顯示資料的組件。
在本文中,我們將創建我們的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 )
{
DefaultMutableT 採用/ DOM根節點並把它轉化成為一個Tree模型
newNode = parseXml( text );
if ( newNode != null )
{
🎦》 treeNode = createTS| Node );
}
else
return null;
} file://結束buildTree()
這個方法取得傳入的XML字串,分析這個XML字串並建構一個可以用來從資料中建構圖形樹狀結構的功能DefaultTreel變數。這個功能原來包含在 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 Documents" );
openingDocText = new DefaultMutableTreeNode
( "When invoking the XmlEditor from
the command-line, you must specify the filename." );
editingDoc = new DefaultMutableTreeNode
皮 幾 n 四 幾 n 四 ));
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( ); super();
getSelectionModel(). setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION );
setShowsRootHandles( true );
setEditable( false Factor); ating( false );
db = dbf.newDocumentBuilder();
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;Buttondprivate Jt; ,我們將建立並新增「 Refresh」按鈕。這個按鈕用來指示這個 XTree元件將使用目前 XML文字來刷新。我們還需要使用一個ActionListener來註冊它。 (參見程式碼段 4 ) 為了攔截按鈕事件,我們需要有這個類別還要實作 ActionListener,而且我們還需要建立一個 actionPerformed()方法 (參見程式碼段 5 )。
程式碼段4:
refreshButton = new JButton( "Refresh" );
refreshButton.setBorder(
Bttonordery.createRaisedBevelorder(Vive); ( refreshButton, BorderLayout. NORTH );
程式碼段5:
public void actionPerformed( ActionEvent ae )
{
if ( ae.getActionCommand().equals( "Refresh" ) )🀎
接下來,我們將創建新的JScrollPane和JTextArea並且把JTextArea加入到JScrollPane中。這樣,我們將得到包含 XTree組件的原始的 JScrollPane和包含 JTextArea組件的新的 JScrollPane。這個原始的 XTree構造程式還有一個修改之處。我們將刪除先前傳進這個方法的字串參數。 (該功能透過我們接下來要建構的另一個XmlEditor()構造程式操作)我們把這兩個方框放進一個JSplitPane中,它是一個有分隔器的元件,可以在這個分隔器的另一邊包含一個組件。 (參見代碼段6)。
程式碼段6:
jScroll = new JScrollPane();
jScrollRt = new JScrollPane();
textArea = new JTextArea( 200,150 ); ree = new XTree();
xTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION );
xTree.setShowsRootHandles(Sc ); ).add( xTree );
splitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT,
jScroll, jScrollRt );
splitPane.setOneTouchEXPandable(true); 00, 150);
jScroll.setMinimumSize( minimumSize );
jScrollRt.setMinimumSize( minimumSize );
splitPane.setPreferredSize( new Dimension(400, 300) );
getentPane().add(Llitane).處理這個非XML檔案的情景。刪除目前構造程式所需的第二個字串參數。這個構造程式現在就是預設的建構程式。我們將建立一個新的建構程式來接收一個字串參數。它將先呼叫預設構造程序,然後處理這個參數。 (參見程式碼段7 )而且,main()方法必須被修改以便在沒有XML檔案的事件中,仍然能建立一個預設的XmlEditor物件。 (參見程式碼段8)
程式碼段7:
public XmlEditor( String title, ArrayList xmlText ) throws
ParserConfigurationException
{
this( title ); textArea.setText( ( String )xmlText.get( 0 ) + " " );
for ( int i = 1; i textArea.append( ( String )xmlText.get( i ) + " " );
xTree.refresh( textArea.getText() );
}
程式碼第8段:
public static void main( String[] args )
public static void main( String[] args )
{
public static Name = BufferedReader reader ;
字串行;
ArrayList xmlText = null;
XmlEditor xmlEditor;
try
{
if( args.length > 0 )
{
{
if( args.length > 0 )
{Name
. fileName .indexOf( ´.´ ) ).equals( ".xml" ) )
{
reader = new BufferedReader( new FileReader( fileName ) );
xmlText = new ArrayList();
readLine ( ) ) != null )
{
xmlText.add( line );
}
reader.close();
xmlEditor = new XmlEditor( "XmlEditor 1.
xmlEditor = new XmlEditor( "XmlEditor 1.0", xml %); 。 " );
exit();
}
catch( Exception ex )
{
方便ex.printStackTrace();
exit();
}
}
為了地處理一次必要修改一般我們不會把可能的文字組成一個長的字串,而是把它當組成一系列字串,每行表示一個底層在數組列表中的字串修改。並且修改之前把這個資料作為一個字串格式化的那個main()方法中的任何呼叫。我們必須加入一些異常處理到XTree 類別。命令在下一篇文章中,我們將在一個圖形對話框中顯示錯誤訊息。在本例中,parseXML()方法中包含的目前例外處理將立即退出。 XTree類別中的「buildTree()」和「refresh()」這兩個方法都有一個條件語句佇列處理空值。 XTree模型穩定。請關注PHP中文網(www.php.cn)!