//導入JAVA類別包
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class EditFile
{
//預設建構函數
EditFile(){}
//儲存檔案函數
void SaveFile(String name,String str)
{
try
{
//聲明文件輸出對象
FileOutputStream fos = new FileOutputStream(name);
//輸出儲存檔案
fos.write(str.getBytes());
}
catch (IOException e)
{
//發生錯誤列印錯誤訊息
System.out.println(e.toString());
}
}
//開啟檔案函數
String OpenFile(String name)
{
//定義字串str來保存檔案內容
String str=null;
//定義計數器
int ch=0;
try
{
//聲明檔輸入對象
FileInputStream fis = new FileInputStream(name);
//遍歷輸入對象,將記憶體儲存到str中
while ((ch=fis.read())!=-1)
{
str=str+(char)ch;
}
//關閉檔案對象
fis.close();
}
catch (IOException e)
{
//發生錯誤列印錯誤訊息
System.out.println(e.toString());
}
//回傳str
return str;
}
}
class MyMainFrame extends JFrame implements ActionListener
{
//檔案名稱
String filename=null;
//查找字串
String findtxt=null;
//替換字串
String replacetxt=null;
//找開始位
int findtxton=-1;
//查找結束位
int findtxtoff=-1;
//中間面版
Container c=getContentPane();
//選單
JMenuBar mainMb=new JMenuBar();
//選單按鈕
JMenu fileMenu=new JMenu("檔案");
JMenu editMenu=new JMenu("編輯");
JMenu typeMenu=new JMenu("格式");
JMenuItem newItem=new JMenuItem("新建");
JMenuItem openItem=new JMenuItem("開啟");
JMenuItem saveItem=new JMenuItem("儲存");
JMenuItem saveasItem=new JMenuItem("另存為");
JMenuItem exitItem=new JMenuItem("退出");
JMenuItem findItem=new JMenuItem("查找");
JMenuItem findnextItem=new JMenuItem("找下一個");
JMenuItem changeItem=new JMenuItem("替換");
JCheckBoxMenuItem changelineItem=new JCheckBoxMenuItem("自動換行",false);
//文字網域
JTextArea txt=new JTextArea();
JTextArea txt2=new JTextArea();
//滾動條
JScrollPane jsp;
//檔案操作對象
EditFile ef=new EditFile();
//建構函式
MyMainFrame()
{
//繪製介面
c.setLayout(new BorderLayout());
jsp= new JScrollPane(txt);
jsp.setHorizontalScrollBarPolicy(jsp.HORIZONTAL_SCROLLBAR_AS_NEEDED);
c.add(jsp,BorderLayout.CENTER);
mainMb.add(fileMenu);
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.add(saveasItem);
fileMenu.addSeparator();
fileMenu.add(exitItem);
mainMb.add(editMenu);
editMenu.add(findItem);
editMenu.add(findnextItem);
editMenu.add(changeItem);
mainMb.add(typeMenu);
typeMenu.add(changelineItem);
setJMenuBar(mainMb);
//為選單新增事件監聽
newItem.addActionListener(this);
openItem.addActionListener(this);
saveItem.addActionListener(this);
saveasItem.addActionListener(this);
exitItem.addActionListener(this);
findItem.addActionListener(this);
findnextItem.addActionListener(this);
changeItem.addActionListener(this);
changelineItem.addActionListener(this);
}
//事件處理函數
public void actionPerformed(ActionEvent e)
{
//建立一個檔案操作對象
EditFile ef=new EditFile();
//如果點選按鈕為新建
if(e.getActionCommand()=="新建")
{
//將文字域置為空
txt.setText(null);
//檔案名為空
filename=null;
}
//如果點擊按鈕為開啟
if(e.getActionCommand()=="開啟")
{
//定義一個檔案窗體
FileDialog openDialog=new FileDialog(this,"開啟檔案...",FileDialog.LOAD);
//顯示窗體
openDialog.show();
//如果回傳檔案不為空
if(openDialog.getFile()!=null)
{
//取得檔案名稱
filename=openDialog.getFile();
//取得文件內容
txt.setText(ef.OpenFile(openDialog.getFile()));
}
}
//如果點擊按鈕為儲存
if(e.getActionCommand()=="儲存")
{
//如果沒有檔名
if(filename==null)
{
//定義一個檔案窗體
FileDialog saveDialog=new FileDialog(this,"另存為...",FileDialog.SAVE);
//顯示窗體
saveDialog.show();
//如果回傳檔案不為空
if(saveDialog.getFile()!=null)
{
//取得檔案名稱
filename=saveDialog.getFile();
//儲存檔案
ef.SaveFile(filename,txt.getText());
}
}
else
{
//直接儲存檔案
ef.SaveFile(filename,txt.getText());
}
}
//如果點擊按鈕為另存為
if(e.getActionCommand()=="另存為")
{
//定義一個檔案窗體
FileDialog saveDialog=new FileDialog(this,"另存為...",FileDialog.SAVE);
//顯示窗體
saveDialog.show();
//如果回傳檔案不為空
if(saveDialog.getFile()!=null)
{
//取得檔案名稱
filename=saveDialog.getFile();
//儲存檔案
ef.SaveFile(filename,txt.getText());
}
}
//如果點擊按鈕為推出
if(e.getActionCommand()=="退出")
{
//退出
System.exit(0);
}
//如果點擊按鈕為查找
if(e.getActionCommand()=="查找")
{
//定義一個對話框
JOptionPane inputdia=new JOptionPane();
//定義對話框獲得查找文本
findtxt=inputdia.showInputDialog("請輸入要找的文字",null);
//定義其實座標
findtxton=-1;
findtxtoff=-1;
//呼叫查找函數
find();
}
//如果點擊按鈕為尋找下一個
if(e.getActionCommand()=="找下一個")
{
//呼叫查找函數
find();
}
//如果點擊按鈕為替換
if(e.getActionCommand()=="替換")
{
//定義一個對話框
JOptionPane inputdia=new JOptionPane();
//獲得尋找和取代文本
findtxt=inputdia.showInputDialog("請輸入要被替換的文字",null);
replacetxt=inputdia.showInputDialog("請輸入替換後的文字",null);
//備份內容
txt2.setText(replacetxt);
txt2.selectAll();
txt2.copy();
//呼叫查找函數
find();
//如果沒找到
if(findtxton==-1&&findtxtoff==-1)
{
}
//如果找到
else
{
//替換
txt.paste();
}
findtxton=-1;
findtxtoff=-1;
}
//如果點擊按鈕為自動換行
if(e.getActionCommand()=="自動換行")
{
//判斷當前狀態
if(changelineItem.isSelected()==true)
{
//設定滾動條狀態
jsp.setHorizontalScrollBarPolicy(jsp.HORIZONTAL_SCROLLBAR_NEVER);
//設定是否換行
txt.setLineWrap(true);
}
else
{
jsp.setHorizontalScrollBarPolicy(jsp.HORIZONTAL_SCROLLBAR_AS_NEEDED);
txt.setLineWrap(false);
}
}
}
//找函數
public void find()
{
//定義臨時字串
String tempstr;
//找文字不為空的話
if(findtxt!=null)
{
try
{
//進行查找
tempstr=txt.getText(findtxton+1,(txt.getText().length()-findtxton-1));
findtxton=findtxton+1+tempstr.indexOf(findtxt);
}
catch(Exception e)
{
}
//如果開始位有變化,即找到
if(findtxton!=-1)
{
//設定結束位
findtxtoff=findtxton+findtxt.length();
}
else
{
//否則顯示沒有找到
findtxtoff=-1;
JOptionPane.showMessageDialog(null,"沒有找到");
}
//將找到部分進行選擇
txt.select(findtxton,findtxtoff);
}
}
}
public class TextEdit
{
//主函數
public static void main(String args[])
{
//聲明設定主窗體
MyMainFrame f=new MyMainFrame();
f.setSize(640,480);
f.setTitle("文字編輯器");
//顯示主窗體
f.setVisible(true);
}
}
/*
JTextArea的自動換行方面的問題
-------------------------------------------------- ------------------------------
如果水平捲軸設定為JSctollpane.
,則添加了這種JSctollpane物件的JTextArea將具備換行功能是這樣嗎?
-------------------------------------------------- ------------------------------
JTextArea.setLineWrap(boolean wrap)
------------- -------------------------------------------------- -----------------
JTextArea.setLineWrap(boolean wrap)//一般的換行。
JTextArea.setWrapStyleWorld(boolean world)//以字邊緣為界線分行
*/