文章詳情頁
使用Java Swing創(chuàng)建一個(gè)XML編輯器之三
瀏覽:10日期:2024-06-22 14:34:28
內(nèi)容: 如果你現(xiàn)在正在尋找一個(gè)跨平臺(tái)、資源開放的XML編輯器的話,您可能很快就能夠?qū)崿F(xiàn)這個(gè)愿望了。在這個(gè)三部分系列文章中,我將帶您利用一些最通常的Java 2 Swing組件開發(fā)一個(gè)簡單的 XML編輯器。本系列將有益于那些想編寫他們的自己的XML編輯器的朋友或者幫助您學(xué)習(xí)或溫習(xí)Swing。 這是本系列的第三篇文章。在第一個(gè)篇文章中,我們簡要地討論了XML和為什么樹形結(jié)構(gòu)適合顯示XML、如何處理XML 數(shù)據(jù)、如何使用JTree Swing組件,并且我們還構(gòu)建一個(gè)可重用組件用來解析XML文件并在JTree中顯示數(shù)據(jù)。 在第二篇文章中,我們創(chuàng)建了用于我們XML編輯器的框架結(jié)構(gòu)。為了做到這個(gè)目的,我們談到了許多Swing組件(包括 JSplitPane、JScrollPane、 JButton和JTextArea )。 JSplitPane對(duì)象又包含了兩個(gè)JScrollPane對(duì)象,一個(gè)用于XML的圖形化瀏覽,另外一個(gè)用于文本瀏覽。 在這最后一篇文章中,我們將把最后的界面添加到 XML編輯器中,使它能夠更加用戶友好化。我們將先構(gòu)建一個(gè)菜單系統(tǒng),然后繼續(xù)構(gòu)造訪問基層文件系統(tǒng)的JFileChooser組件來允許保存XML文件并打開新建文檔。最后,我們將構(gòu)建一個(gè)JDialog框,使用戶能夠取消一個(gè)命令并退出應(yīng)用程序。那么如何增強(qiáng)我們的Swing應(yīng)用程序的性能,以使它們利用菜單,訪問文件系統(tǒng)并允許用戶取消操作呢?我們需要?jiǎng)?chuàng)建JMenu組件來處理應(yīng)用程序的菜單,創(chuàng)建JFileChooser組件來訪問基層文件系統(tǒng),使用JDialog框來允許用戶取消操作。 在以前的文章中,我們開發(fā)了XTree類——一個(gè)衍生于 JTree類的可重用組件,能夠把 XML數(shù)據(jù)以圖形化樹來顯示。因?yàn)槲覀兿矚g使用面向?qū)ο笤瓌t,我們今天所做的修改不會(huì)接觸那個(gè)類。因?yàn)槲覀兿矚g使用面向?qū)ο笤瓌t,我們今天所做的修改不會(huì)接觸那個(gè)類。它是一個(gè)自包含可重復(fù)使用的類,被我們的JFrame容器使用而不是被結(jié)合。 第一節(jié) 構(gòu)建菜單組件 一個(gè)JMenu組件包括幾個(gè)對(duì)象:一個(gè)菜單欄、一個(gè)或更多菜單和一個(gè)或更多菜單項(xiàng)。菜單欄包含菜單,而菜單又包含菜單項(xiàng)。這些Swing組件的名稱都相當(dāng)直觀的(分別為 JMenuBar、JMenu和 JMenuItem)。 下面是創(chuàng)建一個(gè)包含單一菜單項(xiàng)的最小的' File '菜單的全部的代碼: JMenu fileMenu = new JMenu( 'File' );JmenuItem exitItem = new JMenuItem( 'Exit' );fileMenu.add( exitItem );JmenuBar menuBar = new JMenuBar(); menuBar.add( fileMenu );setJMenuBar( menuBar ); 這個(gè)過程我們應(yīng)該非常熟悉,JMenu組件使在任何其他 Java GUI組件構(gòu)建時(shí)創(chuàng)建的。最內(nèi)部的元素被加到它們的直接父元素中,直到所有的元素都已定義了一個(gè)適當(dāng)?shù)娜萜鳌7祷豖mlEditor個(gè)案研究中,我們實(shí)際上已經(jīng)創(chuàng)建了一個(gè)完整的文件菜單,有創(chuàng)建新的 XML文件、打開一個(gè)現(xiàn)有的文件、保存文件和退出的功能。我們將在下一小節(jié)中詳細(xì)談?wù)勊?第二節(jié) 處理菜單事件 我們想要?jiǎng)?chuàng)建一個(gè)典型的文件菜單,能讓我們的用戶創(chuàng)建一個(gè)新文檔,打開一個(gè)現(xiàn)有的文件,保存當(dāng)前的文件并退出應(yīng)用程序。既然我們知道如何構(gòu)建這個(gè)菜單,那么我們?nèi)绾雾憫?yīng)用戶的菜單選擇呢?和其他Swing組件一樣,答案就在于事件模型和可用的監(jiān)聽者組件。 處理一個(gè)菜單選擇最基本的方法就是把一個(gè)作用監(jiān)聽者添加到菜單項(xiàng)中: exitItem.addActionListener(new exitMenuHandler());當(dāng)處理復(fù)雜的事件處理時(shí)(因?yàn)椴藛蜗到y(tǒng)有可能變得很復(fù)雜),應(yīng)當(dāng)把事件處理程序定義成單獨(dú)的類。上面給出的那個(gè)例子添加一個(gè)exitMenuHandler類型的行動(dòng)監(jiān)聽者。這個(gè)類型稍后將在這個(gè)應(yīng)用程序中定義。下面是一個(gè)定義exitMenuHandler類所需要最少的代碼: class exitMenuHandler implements ActionListener {public void actionPerformed( ActionEvent ae ) { System.exit(0); } } 雖然這個(gè)實(shí)現(xiàn)用來證明一個(gè)單獨(dú)類的定義可能似乎太過簡單了,但是當(dāng)我們定義用于打開并保存文件的事件處理代碼時(shí),你將認(rèn)識(shí)到把單獨(dú)的功能性放入單獨(dú)的類文件的重要性。此外,這個(gè)方法將允許你在不同的應(yīng)用程序之間重復(fù)使用公共菜單功能。 第三節(jié) 構(gòu)建文件系統(tǒng)存取組件 這個(gè)Java應(yīng)用程序常常需要允許用戶通過一個(gè)圖形化文件系統(tǒng)瀏覽程序訪問文件系統(tǒng)。典型情況下,這是因?yàn)橛脩粝胍蜷_或保存一個(gè)組件或文件。在我們的XmlEditor應(yīng)用程序中,我們想要用戶能夠做到這些。 為了訪問基本文件系統(tǒng),javax.swing包中有一個(gè)非常好的組件:JFileChooser組件。無疑,在利用 JFileChooser組件之前你已經(jīng)使用一個(gè) Swing應(yīng)用程序。 為了創(chuàng)建一個(gè)JFileChooser,你要先實(shí)例化一個(gè) JFileChooser對(duì)象,設(shè)置它的大小然后聲明它要么用于打開文件要么用于保存文件。你要把這個(gè)對(duì)象和它的父對(duì)象-用來激活它的對(duì)象 (在我們的例子中是一個(gè)菜單項(xiàng))聯(lián)系起來,然后把它要么設(shè)置為打開對(duì)話框或者保存對(duì)話。為了做到這點(diǎn),你要使用showSaveDialog()或 showOpenDialog()方法,兩個(gè)都返回一個(gè)int類型的返回值。下面是一個(gè)簡短的例子: JFileChooser jfc = new JFileChooser();jfc.setSize( 500, 250 );Container parent = openItem.getParent();int choice = jfc.showOpenDialog(parent); 最后一行返回的整數(shù)值指出用戶最后到底是打開/保存一個(gè)文件還是按下取消按鈕。為了響應(yīng)打開/保存事件,可以把這個(gè)整數(shù)值定義在 JFileChooser類中的 APPROVE_OPTION常數(shù)比較。此時(shí),你只須使用適當(dāng)?shù)姆椒ù蜷_/保存用戶請(qǐng)求的文件。請(qǐng)參看代碼段1,是這個(gè)應(yīng)用程序的完整的實(shí)現(xiàn);它包含了所有的六個(gè)方法用于構(gòu)造 XmlEditor應(yīng)用程序的菜單處理功能。 第四節(jié) 構(gòu)建對(duì)話框組件來驗(yàn)證選擇 現(xiàn)在,當(dāng)你點(diǎn)擊 Jframe的關(guān)閉窗口時(shí),這個(gè)應(yīng)用程序立即關(guān)閉。這不太好。如果用戶在操作一個(gè)文件時(shí)意外地關(guān)閉窗口,那么怎么辦?我們想提示用戶,詢問他們是否真要關(guān)閉應(yīng)用程序。 我們可以使用一個(gè)JDialog對(duì)話框來實(shí)現(xiàn)這個(gè)目的。每個(gè)圖形應(yīng)用程序可以在用戶覆蓋另外一個(gè)文件、沒有保存就關(guān)閉某個(gè)文件或在關(guān)閉應(yīng)用程序之前使用它們來提醒用戶。為了簡化編程,我們就把關(guān)心的重點(diǎn)放在關(guān)閉編輯器的時(shí)候,提醒用戶。 我們需要做的就是創(chuàng)建一個(gè)JDialog對(duì)話框,這個(gè)對(duì)話框配有Jlabel,它包含了提示語和兩個(gè)按鈕,一個(gè)用來接收關(guān)閉程序的命令,另外一個(gè)取消關(guān)閉程序的命令。下面是構(gòu)造這個(gè)組件的代碼: JDialog verifyDialog = new JDialog( this, 'Confirm Exit', true );Jlabel question = new JLabel( 'Are you sure you want to exit?' );Jbutton okButton = new JButton( 'OK' );okButton.addActionListener( this );Jbutton cancelButton = new JButton( 'Cancel' );cancelButton.addActionListener( this );verifyDialog.getContentPane().setLayout( new FlowLayout() );verifyDialog.getContentPane().add( question );verifyDialog.getContentPane().add( okButton );verifyDialog.getContentPane().add( cancelButton );verifyDialog.hide(); 現(xiàn)在,還剩兩件事沒做。我們必須為這兩個(gè)按鈕編寫事件處理代碼并把窗口關(guān)閉事件行為用之取代。就處理這兩個(gè)按鈕而言,我們只要在按下 OK時(shí)關(guān)閉這個(gè)應(yīng)用程序而當(dāng)按下 Cancel時(shí)隱藏對(duì)話框。最后一步就是覆蓋默認(rèn)的窗口關(guān)閉事件動(dòng)作。默認(rèn)情況,即使你創(chuàng)建了一個(gè)對(duì)話框然后用戶單擊取消按鈕, JFrame仍然接收到關(guān)閉窗口事件。這將造成 JFrame隱藏本身,除非我們使用下列設(shè)置覆蓋它: setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE ); 新的設(shè)置將使響應(yīng)窗口關(guān)閉事件時(shí)絕對(duì)不會(huì)關(guān)閉它本身。它只有響應(yīng)System.exit()調(diào)用時(shí)才會(huì)關(guān)閉它本身。一旦你添加了菜單組件,定義用于菜單事件的事件處理程序并添加取消意外關(guān)閉窗口事件的方法,我們就可以測試這個(gè)應(yīng)用程序并開始創(chuàng)建、編輯并保存 XML文件了。 恭喜!恭喜!你已經(jīng)有了手工編寫的基于Swing的XML編輯器。剩下的工作就由你來完成了,你需要驗(yàn)證它,增加它的健壯性,還可以增加一些新的功能。附:代碼段1 class newMenuHandler implements ActionListener{ public void actionPerformed ( ActionEvent ae ) {textArea.setText( '' );try{ // 創(chuàng)建一個(gè)新的XTree xTree = new XTree(); xTree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION ); xTree.setShowsRootHandles( true ); // 這個(gè)工具更高級(jí)的版本,允許修改JTree xTree.setEditable( false );}catch( Exception ex ){ String message = ex.getMessage(); ex.printStackTrace();}file://結(jié)束try/catch } file://結(jié)束actionPerformed()}file://結(jié)束class newMenuHandlerclass openMenuHandler implements ActionListener{ JFileChooser jfc; Container parent; int choice; openMenuHandler() {super();jfc = new JFileChooser();jfc.setSize( 400,300 );jfc.setFileFilter( new XmlFileFilter() );parent = openItem.getParent(); }file://結(jié)束openMenuHandler()class openMenuHandler implements ActionListener{ JFileChooser jfc; Container parent; int choice; openMenuHandler() {super();jfc = new JFileChooser();jfc.setSize( 400,300 );jfc.setFileFilter( new XmlFileFilter() ); parent = openItem.getParent(); } public void actionPerformed( ActionEvent ae ) {choice = jfc.showOpenDialog( parent ); if ( choice == JFileChooser.APPROVE_OPTION ){ String fileName, line; BufferedReader reader; fileName = jfc.getSelectedFile().getAbsolutePath(); try {reader = new BufferedReader(new FileReader( fileName ) );textArea.setText( reader.readLine() + 'n' );while ( ( line = reader.readLine() ) != null ){ textArea.append( line + 'n' );} reader.close(); xTree.refresh( textArea.getText() );}catch ( Exception ex ){ String message = ex.getMessage(); ex.printStackTrace();}jfc.setCurrentDirectory( new File( fileName ) );} }}class saveMenuHandler implements ActionListener {JFileChooser jfc;Container parent;int choice;saveMenuHandler(){ super(); jfc = new JFileChooser(); jfc.setSize( 400,300 ); jfc.setFileFilter( new XmlFileFilter() ); parent = saveItem.getParent();} public void actionPerformed( ActionEvent ae ) { choice = jfc.showSaveDialog( parent );if ( choice == JFileChooser.APPROVE_OPTION ){ String fileName; File fObj; FileWriter writer; fileName = jfc.getSelectedFile().getAbsolutePath(); try {writer = new FileWriter( fileName );textArea.write( writer );writer.close(); } catch ( IOException ioe ) {ioe.printStackTrace(); } jfc.setCurrentDirectory( new File( fileName ) );} }}class exitMenuHandler implements ActionListener{ public void actionPerformed( ActionEvent ae ) {verifyDialog.show(); }}class XmlFileFilter extends javax.swing.filechooser.FileFilter{ public boolean accept( File fobj ) {if ( fobj.isDirectory() ) return true;else return fobj.getName().endsWith( '.xml' );}public String getDescription(){ return '*.xml';}} Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽:
Java
相關(guān)文章:
1. 用PHP創(chuàng)建PDF中文文檔2. PHP設(shè)計(jì)模式(一)工廠模式Factory實(shí)例詳解【創(chuàng)建型】3. 在.NET程序崩潰時(shí)自動(dòng)創(chuàng)建Dump的思路詳解4. Python3批量創(chuàng)建Crowd用戶并分配組5. PHP利用ChatGPT實(shí)現(xiàn)輕松創(chuàng)建用戶注冊頁面6. 如何在sublime編輯器中安裝python7. vue+Element中table表格實(shí)現(xiàn)可編輯(select下拉框)8. Python多線程threading創(chuàng)建及使用方法解析9. 淺談vue中使用編輯器vue-quill-editor踩過的坑10. 在vs code 中如何創(chuàng)建一個(gè)自己的 Vue 模板代碼
排行榜
