假如你現在正在尋找一個跨平台、資源開放的xml編輯器的話,您可能很快就能夠實現這個願望了。在這個三部分系列文章中,我將帶您利用一些最通常的Java 2 Swing元件來開發一個簡單的 XML編輯器。本系列將有益於那些想編寫他們的自己的XML編輯器的朋友或幫助您學習或溫習Swing。
這是本系列的第三篇文章。在第一篇文章中,我們簡要地討論了XML和為什麼樹形結構適合顯示XML、如何處理XML 資料、如何使用JTree Swing元件,並且我們還建立一個可重複使用元件用來解析XML檔案並在JTree中顯示數據。
在第二篇文章中,我們建立了用於我們XML編輯器的框架結構。為了做到這個目的,我們談到了許多Swing元件(包括 jsplitPane、JScrollPane、 JButton和JTextArea )。 JSplitPane物件又包含了兩個JScrollPane對象,一個用於XML的圖形化瀏覽,另一個用於文字瀏覽。
在這最後一篇文章中,我們將把最後的介面加入 XML編輯器中,使它能夠更加用戶友好化。我們將先建立一個選單系統,然後繼續建構存取基層檔案系統的JFileChooser元件來答應儲存XML檔案並開啟新文件。最後,我們將建立一個JDialog框,使用戶能夠取消一個命令並退出應用程式。
那麼如何增強我們的Swing應用程式的效能,以使它們利用選單,存取檔案系統並答應使用者取消操作呢?我們需要建立JMenu元件來處理應用程式的選單,建立JFileChooser元件來存取基層檔案系統,使用JDialog框來答應使用者取消操作。
在先前的文章中,我們開發了XTree類別??一個衍生於 JTree類別的可重複使用元件,能夠把 XML資料以圖形化樹來顯示。因為我們喜歡使用物件導向原則,我們今天所做的修改不會接觸到那個類別。因為我們喜歡使用物件導向原則,我們今天所做的修改不會接觸到那個類別。它是一個自包含可重複使用的類,被我們的JFrame容器使用而不是被結合。
第一節 建立選單元件
一個JMenu元件包括幾個物件:一個選單列、一個或更多選單和一個或更多選單項目。選單列包含選單,而選單又包含選單項目。這些Swing元件的名稱都相當直觀的(分別為 JMenuBar、JMenu和 JMenuItem)。
下面是創建一個包含單一選單項目的最小的" File "選單的全部的程式碼:
JMenu fileMenu = new JMenu( "File" );
JmenuItem exitItem = new JMeItemItem( "File" );
JmenuItem exitItem = new JMeItemItem( "File" );
JmenuItem exitItem = new JMeItemItem( "Exit" ); .add( exitItem );
JmenuBar menuBar = new JMenuBar();
menuBar.add( fileMenu );
setJMenuBar( menuBar );建置時創建的。最內部的元素被加到它們的直接父元素中,直到所有的元素都已定義了一個適當的容器。
回到XmlEditor個案研究中,我們實際上已經建立了一個完整的檔案選單,有建立新的 XML檔案、開啟一個現有的檔案、儲存檔案和退出的功能。我們將在下一小節中具體談談它。
第二節 處理選單事件
我們想要建立一個典型的文件選單,能讓我們的使用者建立一個新文檔,開啟一個現有的文件,儲存目前的文件並退出應用程式。既然我們知道如何建立這個選單,那麼我們如何回應使用者的選單選擇呢?和其他Swing元件一樣,答案就在於事件模型和可用的監聽者元件。
處理一個選單選擇最基本的方法就是把一個作用監聽者加入選單項目:exitItem.addActionListener(new exitMenuHandler());當處理複雜的事件處理時(因為選單系統有可能變得很複雜) ,應當把事件處理程序定義成單獨的類別。上面給出的那個例子添加一個exitMenuHandler類型的行動監聽者。這個類型稍後將在這個應用程式中定義。下面是一個定義exitMenuHandler類別所需最少的程式碼:
class exitMenuHandler implements ActionListener {
public void actionPerformed( ActionEvent ae ) {
System.exit(0);
}
}雖然一個用這個實作類別的定義可能似乎太簡單了,但是當我們定義用於開啟並保存檔案的事件處理程式碼時,你將熟悉到把單獨的功能性放入單獨的類別檔案的重要性。此外,這個方法將答應你在不同的應用程式之間重複使用公共選單功能。
第三節 建置檔案系統存取元件
這個Java應用程式經常需要答應使用者透過一個圖形化檔案系統瀏覽程式存取檔案系統。典型情況下,這是因為使用者想要開啟或儲存一個元件或檔案。在我們的XmlEditor應用程式中,我們想要使用者能夠做到這些。
為了存取基本檔案系統,javax.swing套件中有一個非常好的元件:JFileChooser元件。無疑,在利用 JFileChooser元件之前你已經使用一個 Swing應用程式。
為了創建一個JFileChooser,你要先實例化一個 JFileChooser對象,設定它的大小然後聲明它要么用於打開文件要么用於保存文件。你要把這個物件和它的父物件-用來啟動它的物件 (在我們的例子中是一個選單項目)連結起來,然後把它要麼設定為開啟對話框或儲存對話。為了做到這一點,你要使用showSaveDialog()或 showOpenDialog()方法,兩個都傳回一個int類型的回傳值。以下是一個簡短的範例:
JFileChooser jfc = new JFileChooser();
jfc.setSize( 500, 250 );
Container parent = openItem.getParent();
int
Container parent = openItem.getParent();
int最後一行傳回的整數值指出使用者最後到底是開啟/儲存一個檔案還是按下取消按鈕。為了回應開啟/儲存事件,可以把這個整數值定義在 JFileChooser類別中的 APPROVE_OPTION常數比較。此時,你只須使用適當的方法開啟/儲存使用者請求的檔案。
請參考程式碼段1,是這個應用程式的完整的實作;它包含了所有的六個方法用於建構 XmlEditor應用程式的選單處理功能。
第四節 建立對話方塊元件來驗證選擇
現在,當你點擊 Jframe的關閉視窗時,這個應用程式立即關閉。這不太好。如果使用者在操作一個文件時意外地關閉窗口,那麼怎麼辦?我們想提示用戶,詢問他們是否真要關閉應用程式。
我們可以使用一個JDialog對話框來達成這個目的。每個圖形應用程式可以在使用者覆蓋另一個檔案、沒有儲存就關閉某個檔案或在關閉應用程式之前使用它們來提醒使用者。為了簡化編程,我們就把關心的重點放在關閉編輯器的時候,提醒使用者。
我們需要做的就是創建一個JDialog對話框,這個對話框配有Jlabel,它包含了提示語和兩個按鈕,一個用來接收關閉程式的命令,另外一個取消關閉程式的命令。以下是建構這個元件的程式碼:
JDialog verifyDialog = new JDialog( this, "Confirm Exit", true );
Jlabel question = new JLabel( "Are you sure you want to exit?" ); JButton( "OK" );
okButton.addActionListener( this );
Jbutton cancelButton = new JButton( "Cancel" );
cancelButton.addActionListener( this );
verifyDialog.getouta);
verifyDialog.getContentPane().add( question );
verifyDialog.getContentPane().add(Button );
verifyDialog.getContentPane().add( canButton );
verifyDialog.getContentPane().add( cancel㎜件事沒做。我們必須為這兩個按鈕編寫事件處理程式碼並將視窗關閉事件行為用之取代。就處理這兩個按鈕而言,我們只要在按下 OK時關閉這個應用程式而當按下 Cancel時隱藏對話框。
最後一步就是覆蓋預設的視窗關閉事件動作。預設情況,即使你建立了一個對話框然後使用者點擊取消按鈕, JFrame仍然接收到關閉視窗事件。這將造成 JFrame隱藏本身,除非我們使用下列設定覆寫它:
setDefaultCloSEOperation( JFrame.DO_NOTHING_ON_CLOSE );
新的設定將使回應視窗關閉事件時絕對不會關閉它本身。它只有在回應System.exit()呼叫時才會關閉它本身。
一旦你新增了選單元件,定義用於選單事件的事件處理程序並新增取消意外關閉視窗事件的方法,我們就可以測試這個應用程式並開始建立、編輯並儲存 XML檔案了。
恭喜!恭喜!你已經有了手工編寫的基於Swing的XML編輯器。剩下的工作就由你來完成了,你需要驗證它,增加它的健壯性,還可以增加一些新的功能。
附:程式碼段1
class newMenuHandler implements ActionListener
{
public void actionPerformed ( ActionEvent ae )
{ ree
xTree = new XTree ();
xTree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION ); TreeSelectionModel.SINGLE_TREE_SELECTION );》》〜〜〜〜〜〜〜〕〜〜〕〜〜〜〜〕〜); // 這個工具更進階的版本,答應修改JTree
xTree.setEditable( false );
}
catch( Exception ex )
{
String message = ex.getMessage();
ex.printStackTrace();
}🀜
file ://結束類別newMenuHandler
類別openMenuHandler實作ActionListener
{
遠JFileChooser jfc;
遠容器父級;
遠int choice;
遠四openMenuHandler()
fc= at JFileChooser();
遠jfc.setSize( 400 ,300 );jfc.setFileFilter( new XmlFileFilter() );parent = openItem.getParent(); }
新檔://結束openMenuHandler(
新{
新JFileChooser jfc;
新容器父;
新選擇;
新openMenuHandler()
新{
新超級();
新j fc = new JFileCser(fc);
jfc.setFileFilter( new XmlFileFilter() );
parent = openItem.getParent();
}
public void actionPerformed( Action EventAfc) Actione;
if ( choice == JFileChooser.APPROVE_OPTION )
凡{
凡凡String fileName, line;
凡凡BufferedReader reader;
凡凡fileName = jfc.getSelectedFile().getAbsolutePath();
凡凡try
凡凡{
閱讀器= new BufferedReader(
new FileReader( fileName ) );
textArea.setText( reader.readLine() + " " );
{
textArea.append( line + " " );
reader.close();
xTreea.Treej. )
{
String message = ex.getMessage();
ex.printStackTrace( );
佛}
jfc.setCurrentDirectory( new File( Name
); ActionListener
【{
佛】JFileChooser jfc;
佛Containerparent;
佛int choice;
saveMenuHandler()
00 );
public = saveItem。 字串檔名;
文件fObj;
FileWriter writer;
檔案名稱= jfc.getSelectedFile() .getAbsolutePath();
Writer( fileName );
writer.close();
catch (IOException ioe )
{
IOE.printStackTrace ();
⟎ }
杜}
}
類exitMenuHandler 實現ActionListener
{
public void actionPerformed( ActionEvent ae )
️{
️verifyDialog.show();
}
}
class XmlFileFilter 擴展javax.swing.filechooser.FileFilter
{
public boolean Accept( File fobj )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
{
if ( fobj.isDirectory() )
(".xml" );
return fobj.getName().endsWith ( ".xml" );
}
String getDescription()
{
}
}
以上就是使用Java Swing創建一個XML編輯器(三)的內容,更多相關內容請關注PHP中文網(www.php. .cn)!