对文本内指定字符串的查找和替换,文本字符串,//TextFindRe
分享于 点击 25598 次 点评:129
对文本内指定字符串的查找和替换,文本字符串,//TextFindRe
//TextFindReplace.javaimport java.awt.*;import java.awt.event.*;/**类TextFindReplace实现了MouseListener和WindowListener接口*/public class TextFindReplace implements MouseListener,WindowListener{ private Frame frObj; private TextArea taObj; private TextField tfObj1,tfObj2; private Button buttonObj1; private Button buttonObj2; private Button buttonObj3; private Panel pObj1,pObj2,pObj3,pObj4,pObj5; private Label labObj1,labObj2,labObj3; boolean boolObj = false; Dialog diaObj; Label textLab; Button butObj2 = new Button("OK"); public static void main(String args[]) { TextFindReplace examObj = new TextFindReplace(); examObj.create(); } /**create()方法用于创建主界面和创建有关查找和替换字符串结果信息的对话框*/ public void create(){ //下面是创建主界面 frObj = new Frame("文本的查找与替换"); //taObj代表界面上的文本区域 taObj = new TextArea(); //tfObj1代表用于输入待查找或替换前的字符串的文本框 tfObj1 = new TextField(); //tfObj2代表用于输入替换后的字符串的文本框 tfObj2 = new TextField(); //初始化两个按钮对象,分别用来实现”查找“和”替换“操作 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 = new Panel(); pObj2 = new Panel(); pObj3 = new Panel(); pObj4 = new Panel(); pObj5 = new Panel(); //pObj1用于控制文本区域和相关提示信息的相对位置 pObj1.setLayout(new BorderLayout()); pObj1.add("North",labObj1); pObj1.add("Center",taObj); //pObj2用于控制第一个文本框和相关提示信息的相对位置 pObj2.setLayout(new BorderLayout()); pObj2.add("North",labObj2); pObj2.add("Center",tfObj1); //pObj3用于控制第二个文本框和相关提示信息的相对位置 pObj3.setLayout(new BorderLayout()); pObj3.add("North",labObj3); pObj3.add("Center",tfObj2); //pObj4用于控制Find按钮和Replace按钮的相对位置 pObj4.setLayout(new FlowLayout(FlowLayout.CENTER,20,20)); pObj4.add(buttonObj1); pObj4.add(buttonObj2); pObj4.add(buttonObj3); //pObj5用于控制pObj2、pObj3和pObj4的相对位置 pObj5.setLayout(new GridLayout(3,1)); pObj5.add(pObj2); pObj5.add(pObj3); pObj5.add(pObj4); //最后通过frObj控制整体的效果 frObj.setLayout(new GridLayout(1,2)); 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 = new Dialog(frObj); diaObj.setLayout(new FlowLayout(FlowLayout.CENTER,40,20)); textLab = new Label(""); diaObj.add(textLab); diaObj.add(butObj2); butObj2.addMouseListener(this); diaObj.setSize(200,100); } /**方法mouseClicked用于处理鼠标单击的事件,也就是当鼠标单击事件发生后,程序就会进入该方法中执行*/ public void mouseClicked(MouseEvent e){ //下面这个语句用于获得事件源按钮 Button butObj = (Button)(e.getSource()); //下面的if语句处理事件源是Find按钮或Replace按钮时的情况 if(butObj.getLabel()=="Exit") { System.exit(0); } 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+"处"); //下面的语句用于刷新字符串替换后文本区域的文字显示 StringBuffer taText = classObj.repStr; taObj.setText(taText.toString()); diaObj.setVisible(true); } } //下面的if语句用于处理事件源为OK按钮时的情况 if(butObj.getLabel()=="OK") { //单击OK按钮后,信息提示对话框消失,主界面显示 diaObj.setVisible(false); frObj.setVisible(true); } } //下面的语句重写MouseListener和WindowListener接口中的方法 public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} //重写windowClosing方法,关闭窗口时,程序退出 public void windowClosing(WindowEvent e){ System.exit(0); } public void windowOpened(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowClosed(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){}}/**类matchFun用于处理有关字符串查找和替换算法*/class matchFun{ StringBuffer repStr; /*方法strFind用于实现字符串查找,返回匹配的次数*/ public int strFind(String s1,String s2,int pos) { /*变量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用于实现字符串替换操作,返回替换的次数*/ public int strReplace(String s1,String s2,String s3,int pos) { /*变量i和j分别表示主串和模式串中当前字符串的位置,k表示匹配次数*/ int i,j,k=0; i = pos; j = 0; //将s1转化成StringBuffer型进行操作 repStr = new StringBuffer(s1); 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; }}
用户点评