//TextFindReplace.java
import java.awt.*;
import java.awt.event.*;
/**类TextFindReplace实现了MouseListener和WindowListener接口*/
private Panel pObj1,pObj2,pObj3,pObj4,pObj5
;
private Label labObj1,labObj2,labObj3
;
boolean boolObj = false;
public static void main
(String args
[])
{
TextFindReplace examObj = new TextFindReplace();
examObj.create();
}
/**create()方法用于创建主界面和创建有关查找和替换字符串结果信息的对话框*/
public void create(){
//下面是创建主界面
frObj
= new Frame("文本的查找与替换");
//taObj代表界面上的文本区域
//tfObj1代表用于输入待查找或替换前的字符串的文本框
//tfObj2代表用于输入替换后的字符串的文本框
//初始化两个按钮对象,分别用来实现”查找“和”替换“操作
buttonObj1
= new Button("Find");
buttonObj2
= new Button("Replace");
buttonObj3
= new Button("Exit");
//下面的三个Label对象用于显示有关的提示信息
labObj1
= new Label("文本区域(从光标处开始查找):");
labObj2
= new Label("待查找或替换前的字符串:");
labObj3
= new Label("替换后的字符串:");
//接下来的5个Panel对象用于控制主界面上各组件的位置和大小
//pObj1用于控制文本区域和相关提示信息的相对位置
pObj1.add("North",labObj1);
pObj1.add("Center",taObj);
//pObj2用于控制第一个文本框和相关提示信息的相对位置
pObj2.add("North",labObj2);
pObj2.add("Center",tfObj1);
//pObj3用于控制第二个文本框和相关提示信息的相对位置
pObj3.add("North",labObj3);
pObj3.add("Center",tfObj2);
//pObj4用于控制Find按钮和Replace按钮的相对位置
pObj4.add(buttonObj1);
pObj4.add(buttonObj2);
pObj4.add(buttonObj3);
//pObj5用于控制pObj2、pObj3和pObj4的相对位置
pObj5.add(pObj2);
pObj5.add(pObj3);
pObj5.add(pObj4);
//最后通过frObj控制整体的效果
frObj.add(pObj1);
frObj.add(pObj5);
//为Find按钮、Replace按钮和主窗口添加事件监听器
buttonObj1.addMouseListener(this);
buttonObj2.addMouseListener(this);
buttonObj3.addMouseListener(this);
frObj.addWindowListener(this);
//下面两个语句设置主界面的大小并让主界面可见
frObj.setSize(400,260);
frObj.setVisible(true);
/*下面的语句用于创建一个对话框,当用户单击Find按钮或者Replace按钮后,根据结果显示
一个有关结果信息的对话框,对话框上有一个Label组件和一个OK按钮,Label组件用于显示
查找或替换字符串的次数*/
diaObj.add(textLab);
diaObj.add(butObj2);
butObj2.addMouseListener(this);
diaObj.setSize(200,100);
}
/**方法mouseClicked用于处理鼠标单击的事件,也就是当鼠标单击事件发生后,程序就会进入该方法中执行*/
//下面这个语句用于获得事件源按钮
//下面的if语句处理事件源是Find按钮或Replace按钮时的情况
if(butObj.getLabel()=="Exit")
{
}
if(butObj.getLabel()=="Find"||butObj.getLabel()=="Replace")
{
/*String型变量strObj1和strObj2获得文本区域和第一个文本框中的文字内容*/
String strObj1
= taObj.
getText();
String strObj2
= tfObj1.
getText();
//变量matchNum代表字符串匹配的次数,初始值为0
int matchNum = 0;
//cursorPos代表光标当前的位置
int cursorPos = taObj.getCaretPosition();
//实例化一个matchFun类的对象
matchFun classObj = new matchFun();
//下面的if语句处理单击Find按钮事件
if(butObj.getLabel()=="Find")
{
//通过调用matchFun类的方法strFind计算出字符串匹配的次数
matchNum = classObj.strFind(strObj1,strObj2,cursorPos);
//下面的一行语句重新设置对话框上Label对象的文本内容
textLab.setText("共找到"+matchNum+"处");
diaObj.setVisible(true);
}
//接下来的if语句处理单击Replace按钮事件
if(butObj.getLabel()=="Replace")
{
//变量strObj3获得第二个文本框中的字符串
String strObj3
= tfObj2.
getText();
//通过调用matchFun类中的strReplace按钮计算字符串匹配次数
matchNum = classObj.strReplace(strObj1,strObj2,strObj3,cursorPos);
//重新设置对话框上Label对象的文本内容
textLab.setText("共替换到"+matchNum+"处");
//下面的语句用于刷新字符串替换后文本区域的文字显示
taObj.setText(taText.toString());
diaObj.setVisible(true);
}
}
//下面的if语句用于处理事件源为OK按钮时的情况
if(butObj.getLabel()=="OK")
{
//单击OK按钮后,信息提示对话框消失,主界面显示
diaObj.setVisible(false);
frObj.setVisible(true);
}
}
//下面的语句重写MouseListener和WindowListener接口中的方法
//重写windowClosing方法,关闭窗口时,程序退出
}
}
/**类matchFun用于处理有关字符串查找和替换算法*/
class matchFun{
/*方法strFind用于实现字符串查找,返回匹配的次数*/
{
/*变量i和j分别表示主串和模式串中当前字符串的位置,k表示匹配次数*/
int i,j,k=0;
//pos代表主串中开始比较的位置
i = pos;
j = 0;
while(i<s1.length()&&j<s2.length())
{
if(s1.charAt(i) == s2.charAt(j))
{
++i; ++j;
if(j==s2.length())
{
//j=s2.length()表示字符串匹配成功,匹配次数加1
k = k+1;
//将指示主串和模式串中当前字符的变量i和j进行回退
i = i-j+1;
j = 0;
}
}
else {i = i-j+1; j = 0;}
}
return k;
}
/*方法strReplace用于实现字符串替换操作,返回替换的次数*/
{
/*变量i和j分别表示主串和模式串中当前字符串的位置,k表示匹配次数*/
int i,j,k=0;
i = pos;
j = 0;
//将s1转化成StringBuffer型进行操作
while(i<repStr.length()&&j<s2.length())
{
if(repStr.charAt(i) == s2.charAt(j))
{
++i; ++j;
if(j==s2.length())
{
/*j=s2.length()表示字符串匹配成功,匹配次数加1,此外对主串进行字符串替换*/
k = k+1;
repStr.replace(i-j,i,s3);
//将j进行重新赋值开始新的比较
j = 0;
}
}
else {i = i-j+1; j = 0;}
}
return k;
}
}
//java/1307