国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

使用Java Swing 創(chuàng)建一個XML編輯器(三)

2019-11-18 15:13:58
字體:
來源:轉載
供稿:網友

  www.dukejava.com 網絡嬌娃工作站
 
假如你現在正在尋找一個跨平臺、資源開放的xml編輯器的話,您可能很快就能夠實現這個愿望了。在這個三部分系列文章中,我將帶您利用一些最通常的Java 2 Swing組件開發(fā)一個簡單的 XML編輯器。本系列將有益于那些想編寫他們的自己的XML編輯器的朋友或者幫助您學習或溫習Swing。
 

  這是本系列的第三篇文章。在第一個篇文章中,我們簡要地討論了XML和為什么樹形結構適合顯示XML、如何處理XML 數據、如何使用JTree Swing組件,并且我們還構建一個可重用組件用來解析XML文件并在JTree中顯示數據。

  在第二篇文章中,我們創(chuàng)建了用于我們XML編輯器的框架結構。為了做到這個目的,我們談到了許多Swing組件(包括 jsplitPane、JScrollPane、 JButton和JTextArea )。 JSplitPane對象又包含了兩個JScrollPane對象,一個用于XML的圖形化瀏覽,另外一個用于文本瀏覽。

  在這最后一篇文章中,我們將把最后的界面添加到 XML編輯器中,使它能夠更加用戶友好化。我們將先構建一個菜單系統,然后繼續(xù)構造訪問基層文件系統的JFileChooser組件來答應保存XML文件并打開新建文檔。最后,我們將構建一個JDialog框,使用戶能夠取消一個命令并退出應用程序。

  那么如何增強我們的Swing應用程序的性能,以使它們利用菜單,訪問文件系統并答應用戶取消操作呢?我們需要創(chuàng)建JMenu組件來處理應用程序的菜單,創(chuàng)建JFileChooser組件來訪問基層文件系統,使用JDialog框來答應用戶取消操作。

  在以前的文章中,我們開發(fā)了XTree類??一個衍生于 JTree類的可重用組件,能夠把 XML數據以圖形化樹來顯示。因為我們喜歡使用面向對象原則,我們今天所做的修改不會接觸那個類。因為我們喜歡使用面向對象原則,我們今天所做的修改不會接觸那個類。它是一個自包含可重復使用的類,被我們的JFrame容器使用而不是被結合。

  第一節(jié) 構建菜單組件

  一個JMenu組件包括幾個對象:一個菜單欄、一個或更多菜單和一個或更多菜單項。菜單欄包含菜單,而菜單又包含菜單項。這些Swing組件的名稱都相當直觀的(分別為 JMenuBar、JMenu和 JMenuItem)。

  下面是創(chuàng)建一個包含單一菜單項的最小的" File "菜單的全部的代碼:

JMenu fileMenu = new JMenu( "File" );
JmenuItem exitItem = new JMenuItem( "Exit" );

fileMenu.add( exitItem );

JmenuBar menuBar = new JMenuBar();
 
menuBar.add( fileMenu );

setJMenuBar( menuBar );

  這個過程我們應該非常熟悉,JMenu組件使在任何其他 Java GUI組件構建時創(chuàng)建的。最內部的元素被加到它們的直接父元素中,直到所有的元素都已定義了一個適當的容器。

  返回XmlEditor個案研究中,我們實際上已經創(chuàng)建了一個完整的文件菜單,有創(chuàng)建新的 XML文件、打開一個現有的文件、保存文件和退出的功能。我們將在下一小節(jié)中具體談談它。

  第二節(jié) 處理菜單事件

  我們想要創(chuàng)建一個典型的文件菜單,能讓我們的用戶創(chuàng)建一個新文檔,打開一個現有的文件,保存當前的文件并退出應用程序。既然我們知道如何構建這個菜單,那么我們如何響應用戶的菜單選擇呢?和其他Swing組件一樣,答案就在于事件模型和可用的監(jiān)聽者組件。

  處理一個菜單選擇最基本的方法就是把一個作用監(jiān)聽者添加到菜單項中: exitItem.addActionListener(new exitMenuHandler());當處理復雜的事件處理時(因為菜單系統有可能變得很復雜),應當把事件處理程序定義成單獨的類。上面給出的那個例子添加一個exitMenuHandler類型的行動監(jiān)聽者。這個類型稍后將在這個應用程序中定義。下面是一個定義exitMenuHandler類所需要最少的代碼:

class exitMenuHandler implements ActionListener {
public void actionPerformed( ActionEvent ae ) {
System.exit(0);
}
}

  雖然這個實現用來證實一個單獨類的定義可能似乎太過簡單了,但是當我們定義用于打開并保存文件的事件處理代碼時,你將熟悉到把單獨的功能性放入單獨的類文件的重要性。此外,這個方法將答應你在不同的應用程序之間重復使用公共菜單功能。

第三節(jié) 構建文件系統存取組件

  這個Java應用程序經常需要答應用戶通過一個圖形化文件系統瀏覽程序訪問文件系統。典型情況下,這是因為用戶想要打開或保存一個組件或文件。在我們的XmlEditor應用程序中,我們想要用戶能夠做到這些。

  為了訪問基本文件系統,javax.swing包中有一個非常好的組件:JFileChooser組件。無疑,在利用 JFileChooser組件之前你已經使用一個 Swing應用程序。

  為了創(chuàng)建一個JFileChooser,你要先實例化一個 JFileChooser對象,設置它的大小然后聲明它要么用于打開文件要么用于保存文件。你要把這個對象和它的父對象-用來激活它的對象 (在我們的例子中是一個菜單項)聯系起來,然后把它要么設置為打開對話框或者保存對話。為了做到這點,你要使用showSaveDialog()或 showOpenDialog()方法,兩個都返回一個int類型的返回值。下面是一個簡短的例子:

JFileChooser jfc = new JFileChooser();
jfc.setSize( 500, 250 );
Container parent = openItem.getParent();
int choice = jfc.showOpenDialog(parent);

  最后一行返回的整數值指出用戶最后到底是打開/保存一個文件還是按下取消按鈕。為了響應打開/保存事件,可以把這個整數值定義在 JFileChooser類中的 APPROVE_OPTION常數比較。此時,你只須使用適當的方法打開/保存用戶請求的文件。

  請參看代碼段1,是這個應用程序的完整的實現;它包含了所有的六個方法用于構造 XmlEditor應用程序的菜單處理功能。

  第四節(jié) 構建對話框組件來驗證選擇

  現在,當你點擊 Jframe的關閉窗口時,這個應用程序立即關閉。這不太好。假如用戶在操作一個文件時意外地關閉窗口,那么怎么辦?我們想提示用戶,詢問他們是否真要關閉應用程序。

  我們可以使用一個JDialog對話框來實現這個目的。每個圖形應用程序可以在用戶覆蓋另外一個文件、沒有保存就關閉某個文件或在關閉應用程序之前使用它們來提醒用戶。為了簡化編程,我們就把關心的重點放在關閉編輯器的時候,提醒用戶。

  我們需要做的就是創(chuàng)建一個JDialog對話框,這個對話框配有Jlabel,它包含了提示語和兩個按鈕,一個用來接收關閉程序的命令,另外一個取消關閉程序的命令。下面是構造這個組件的代碼:

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();

  現在,還剩兩件事沒做。我們必須為這兩個按鈕編寫事件處理代碼并把窗口關閉事件行為用之取代。就處理這兩個按鈕而言,我們只要在按下 OK時關閉這個應用程序而當按下 Cancel時隱藏對話框。

  最后一步就是覆蓋默認的窗口關閉事件動作。默認情況,即使你創(chuàng)建了一個對話框然后用戶單擊取消按鈕, JFrame仍然接收到關閉窗口事件。這將造成 JFrame隱藏本身,除非我們使用下列設置覆蓋它:

setDefaultCloSEOperation( JFrame.DO_NOTHING_ON_CLOSE );

  新的設置將使響應窗口關閉事件時絕對不會關閉它本身。它只有響應System.exit()調用時才會關閉它本身。

  一旦你添加了菜單組件,定義用于菜單事件的事件處理程序并添加取消意外關閉窗口事件的方法,我們就可以測試這個應用程序并開始創(chuàng)建、編輯并保存 XML文件了。

  恭喜!恭喜!你已經有了手工編寫的基于Swing的XML編輯器。剩下的工作就由你來完成了,你需要驗證它,增加它的健壯性,還可以增加一些新的功能。

附:代碼段1

class newMenuHandler implements ActionListener
{
 public void actionPerformed ( ActionEvent ae )
 {
  textArea.setText( "" );
  try
  { // 創(chuàng)建一個新的XTree
   xTree = new XTree();
   xTree.getSelectionModel().setSelectionMode(  
      TreeSelectionModel.SINGLE_TREE_SELECTION );
   xTree.setShowsRootHandles( true );
   // 這個工具更高級的版本,答應修改JTree
   xTree.setEditable( false );
  }
  catch( Exception ex )
  {
   String message = ex.getMessage();
   ex.printStackTrace();
  }
  file://結束try/catch
 }
 file://結束actionPerformed()
}
file://結束class newMenuHandler
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(); }
  file://結束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() + "" );

    while ( ( line = reader.readLine() ) != null )
    {
     textArea.append( line + "" );
    }
   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";
}
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 贵溪市| 株洲县| 靖西县| 嘉峪关市| 锡林浩特市| 武清区| 安岳县| 拉孜县| 遂昌县| 光山县| 云梦县| 保靖县| 沅江市| 右玉县| 沿河| 筠连县| 永定县| 沽源县| 永州市| 天气| 珠海市| 威信县| 武邑县| 灯塔市| 苍溪县| 鄂尔多斯市| 南充市| 衡阳县| 扶沟县| 七台河市| 山东省| 大新县| 清涧县| 新田县| 望奎县| 巫溪县| 山阳县| 乐业县| 大渡口区| 铁岭县| 应用必备|