用JBuilder9開發一個文本編輯器
|
一、概述
文本編輯器是一種最常用的應用程序,下面我們利用Jbuilder 9集成開發環境,用java語言實現一個簡單的文本編輯器。該文本編輯器具有讀出、寫入、編輯文本文件,可以設定文字顏色、字形和編輯區域背景顏色等基本功能。
我們首先通過Jbuilder 9項目向導和應用向導創建項目,然后應用可視化設計工具,修改UI設計,連接事件,編輯源碼以及常用控件和任務諸如菜單項、工具條、文本區域和系統事件等常用控件和任務的處理。涉及到具體技術有:
用JFileChooser 對話框讓用戶選擇文本文件。
用JtextArea讀、寫和處理文本文件中的文字。
設置前景色和背景色。
用dbSwing FontChooser對話框設置字型。
在狀態欄和窗口標題欄顯示信息。
手工添加處理UI事件的代碼 。
通過將代碼放在一個可被菜單項和按鈕兩個事件處理器調用的新的"幫助"方法中, 使得菜單項和按鈕執行相同的代碼。
給JtextArea控件增加一個右擊菜單。
保持對文件的位置以及文件是否活動過的跟蹤,展示對文件|新建, 文件|打開, 文件|保存, 文件|另存為,編輯和退出等邏輯的處理。
將"Text Editor" 應用程序展開為JAR 文件。
二、開發文本編輯器java源程序說明
文本編輯器程序包含三個java 源程序即TextEditFrame.java、TextEditclass.java 和TextEditFrame_AboutBox.java 程序,下面將分別介紹如下:
1、TextEditFrame.java的源程序代碼(節選部分):
| package texteditor; //TextEditFrame.java import java.awt.*;//導入類 import java.awt.event.*; import javax.swing.*; import com.borland.dbswing.*; import java.io.*; import javax.swing.text.*; import javax.swing.event.*; public class TextEditFrame extends JFrame { IntlSwingSupport intlSwingSupport1 = new IntlSwingSupport(); //Swing 控件互聯網化:即本地化應用程序,需要添加一行代碼以便Swing 控件JfileChooser //和JcolorChooser出現在程序運行的語言中 JPanel contentPane; //設置內容窗(contentPane)的JPanel控件 JMenuBar menuBar1 = new JMenuBar();//創建菜單條并加入到框架窗體中 JMenu menuFile = new JMenu();//創建File菜單和相應的菜單項 JMenuItem menuFileExit = new JMenuItem(); JMenu menuHelp = new JMenu();//創建Help菜單和相應的菜單項 JMenuItem menuHelpAbout = new JMenuItem(); JToolBar toolBar = new JToolBar();//創建工具條組件 JButton jButton1 = new JButton();//創建按鈕組件 JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); ImageIcon image1;//定義圖標 ImageIcon image2; ImageIcon image3; JLabel statusBar = new JLabel();//創建標簽組件 BorderLayout borderLayout1 = new BorderLayout();//創建BorderLayout 布局器 JScrollPane jScrollPane1 = new JScrollPane();//創建滾動窗控件 JTextArea jTextArea1 = new JTextArea();//創建多行文本域組件 JMenuItem jMenuItem1 = new JMenuItem();//創建菜單項 JMenuItem jMenuItem2 = new JMenuItem(); JMenuItem jMenuItem3 = new JMenuItem(); JMenuItem jMenuItem4 = new JMenuItem(); FontChooser fontChooser1 = new FontChooser();//創建字型選擇對話框 JMenu jMenu1 = new JMenu(); JMenuItem jMenuItem5 = new JMenuItem(); JMenuItem jMenuItem6 = new JMenuItem(); JMenuItem jMenuItem7 = new JMenuItem(); JFileChooser jFileChooser1 = new JFileChooser();//創建文本選擇對話框 String currFileName = null; // Full path with filename. null means new/untitled. boolean dirty = false; Document document1; //文本 DBTextDataBinder dBTextDataBinder1 = new DBTextDataBinder(); // True means modified text. //構造架框 public TextEditFrame() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); updateCaption(); } catch(Exception e) { e.printStackTrace(); } } //組件初始化 private void jbInit() throws Exception { //三個工具欄按鈕圖標 image1 = new ImageIcon(TextEditFrame.class.getResource("openFile.gif")); image2 = new ImageIcon(TextEditFrame.class.getResource("closeFile.gif")); image3 = new ImageIcon(TextEditFrame.class.getResource("help.gif")); contentPane = (JPanel) this.getContentPane();//內容創格 document1 = jTextArea1.getDocument();//多行文本域文檔 contentPane.setLayout(borderLayout1);//borderLayout布局器 this.setSize(new Dimension(400, 300));//窗口大小 this.setTitle("Text Editor");//窗口標題 statusBar.setText(" "); menuFile.setText("File"); menuFileExit.setText("Exit"); menuFileExit.addActionListener(new TextEditFrame_menuFileExit_ActionAdapter (this)); //添加事件監聽器 menuHelp.setText("Help"); menuHelpAbout.setText("About"); menuHelpAbout.addActionListener(new TextEditFrame_menuHelpAbout_ActionAdapter (this)); jButton1.setIcon(image1);//設置三個工具欄按鈕圖標,添加事件監聽器 jButton1.addActionListener(new TextEditFrame_jButton1_actionAdapter(this)); jButton1.setToolTipText("Open File"); jButton2.setIcon(image2); jButton2.addActionListener(new TextEditFrame_jButton2_actionAdapter(this)); jButton2.setToolTipText("Close File"); jButton3.setIcon(image3); jButton3.addActionListener(new TextEditFrame_jButton3_actionAdapter(this)); jButton3.setToolTipText("About"); jTextArea1.setLineWrap(true); jTextArea1.setWrapStyleWord(true); jTextArea1.setBackground(Color.white); jMenuItem1.setText("New");//設置菜單,添加事件監聽器 jMenuItem1.addActionListener(new TextEditFrame_jMenuItem1_actionAdapter(this)); jMenuItem2.setText("Open"); jMenuItem2.addActionListener(new TextEditFrame_jMenuItem2_actionAdapter(this)); jMenuItem3.setText("Save"); jMenuItem3.addActionListener(new TextEditFrame_jMenuItem3_actionAdapter(this)); jMenuItem4.setText("Save As"); jMenuItem4.addActionListener(new TextEditFrame_jMenuItem4_actionAdapter(this)); fontChooser1.setFrame(this); fontChooser1.setTitle("Font"); jMenu1.setText("Edit"); jMenuItem5.setText("Font"); jMenuItem5.addActionListener(new TextEditFrame_jMenuItem5_actionAdapter(this)); jMenuItem6.setText("Foreground Color"); jMenuItem6.addActionListener(new TextEditFrame_jMenuItem6_actionAdapter(this)); jMenuItem7.setText("Background Color"); jMenuItem7.addActionListener(new TextEditFrame_jMenuItem7_actionAdapter(this)); document1.addDocumentListener(new TextEditFrame_document1_documentAdapter(this)); dBTextDataBinder1.setJTextComponent(jTextArea1); //Turn off right-click file Open... menu item. dBTextDataBinder1.setEnableFileLoading(false); //Turn off right-click file Save... menu item. dBTextDataBinder1.setEnableFileSaving(false); toolBar.add(jButton1);//工具組件添加按鈕 toolBar.add(jButton2); toolBar.add(jButton3); menuFile.add(jMenuItem1);//菜單組件添加菜單項 menuFile.add(jMenuItem2); menuFile.add(jMenuItem3); menuFile.add(jMenuItem4); menuFile.addSeparator();//采單組件添加分隔線 menuFile.add(menuFileExit); menuHelp.add(menuHelpAbout); menuBar1.add(menuFile); menuBar1.add(jMenu1); menuBar1.add(menuHelp); this.setJMenuBar(menuBar1); contentPane.add(toolBar, BorderLayout.NORTH); //內容窗設置borderLayout布局器 contentPane.add(statusBar, BorderLayout.SOUTH); contentPane.add(jScrollPane1, BorderLayout.CENTER); jScrollPane1.getViewport().add(jTextArea1, null); jMenu1.add(jMenuItem5); jMenu1.add(jMenuItem6); jMenu1.add(jMenuItem7); } // Display the About box. void helpAbout() { TextEditFrame_AboutBox dlg = new TextEditFrame_AboutBox(this); Dimension dlgSize = dlg.getPreferredSize(); Dimension frmSize = getSize(); Point loc = getLocation(); dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y); dlg.setModal(true); dlg.show(); } ......... ......... |