📄 stringfindreplace.java
字号:
import java.awt.*;
import java.awt.event.*;
public class StringFindReplace implements MouseListener, WindowListener {
private Frame myFrame;
private TextArea myTextArea;
private TextField myTextField1, myTextField2;
private Button myButton1;
private Button myButton2;
private Panel myPanel1, myPanel2, myPanel3, myPanel4, myPanel5;
private Label myLabel1, myLabel2, myLabel3;
//boolean myFlag = false;
Dialog myDialog;
Label textLab;
Button myButton = new Button("确认");
public static void main(String args[]) {
StringFindReplace myExam = new StringFindReplace();
myExam.create();
}
//create()方法用于创建主界面和创建有关查找和替换字符串结果信息的对话框
public void create() {
//下面是创建主界面
myFrame = new Frame("字符串的查找和替换");
//myTextArea代表界面上的文本区域
myTextArea = new TextArea();
//myTextField1代表用于输入待查找或替换前的字符串的文本框
myTextField1 = new TextField();
//myTextField2代表用于输入替换后的字符串的文本框
myTextField2 = new TextField();
//初始化两个按钮对象,分别用来实现”查找“和”替换“操作
myButton1 = new Button("查找");
myButton2 = new Button("替换");
//下面的三个Label对象用于显示有关的提示信息
myLabel1 = new Label("文本区域:");
myLabel2 = new Label("待查找或替换前的字符串:");
myLabel3 = new Label("替换后的字符串:");
//接下来的5个Panel对象用于控制主界面上各组件的位置和大小
myPanel1 = new Panel();
myPanel2 = new Panel();
myPanel3 = new Panel();
myPanel4 = new Panel();
myPanel5 = new Panel();
//myPanel1用于控制文本区域和相关提示信息的相对位置
myPanel1.setLayout(new BorderLayout());
myPanel1.add("North", myLabel1);
myPanel1.add("Center", myTextArea);
//myPanel2用于控制第一个文本框和相关提示信息的相对位置
myPanel2.setLayout(new BorderLayout());
myPanel2.add("North", myLabel2);
myPanel2.add("Center", myTextField1);
//myPanel3用于控制第二个文本框和相关提示信息的相对位置
myPanel3.setLayout(new BorderLayout());
myPanel3.add("North", myLabel3);
myPanel3.add("Center", myTextField2);
//myPanel4用于控制“查找”按钮和“替换”按钮的相对位置
myPanel4.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));
myPanel4.add(myButton1);
myPanel4.add(myButton2);
//myPanel5用于控制myPanel2、myPanel3和myPanel4的相对位置
myPanel5.setLayout(new GridLayout(3, 1));
myPanel5.add(myPanel2);
myPanel5.add(myPanel3);
myPanel5.add(myPanel4);
//最后通过myFrame控制整体的效果
myFrame.setLayout(new GridLayout(1, 2));
myFrame.add(myPanel1);
myFrame.add(myPanel5);
//为“查找”按钮、“替换”按钮和主窗口添加事件监听器
myButton1.addMouseListener(this);
myButton2.addMouseListener(this);
myFrame.addWindowListener(this);
//下面两个语句设置主界面的大小并让主界面可见
myFrame.setSize(400, 260);
myFrame.setVisible(true);
/*
* 下面的语句用于创建一个对话框,当用户单击“查找”按钮或者“替换”按钮后,根据结果显示
* 一个有关结果信息的对话框,对话框上有一个Label组件和一个确认按钮,Label组件用于显示 查找或替换字符串的次数
*/
myDialog = new Dialog(myFrame);
myDialog.setLayout(new FlowLayout(FlowLayout.CENTER, 40, 20));
textLab = new Label("");
myDialog.add(textLab);
myDialog.add(myButton);
myButton.addMouseListener(this);
myDialog.setSize(200, 100);
}
/** 方法mouseClicked用于处理鼠标单击的事件,也就是当鼠标单击事件发生后,程序就会进入该方法中执行 */
public void mouseClicked(MouseEvent e) {
//下面这个语句用于获得事件源按钮
Button myBTN = (Button) (e.getSource());
//下面的if语句处理事件源是“查找”按钮或“替换”按钮时的情况
if (myBTN.getLabel() == "查找" || myBTN.getLabel() == "替换") {
/* String型变量myString1和myString2获得文本区域和第一个文本框中的文字内容 */
String myString1 = myTextArea.getText();
String myString2 = myTextField1.getText();
//变量matchNum代表字符串匹配的次数,初始值为0
int matchNum = 0;
//cursorPos代表光标当前的位置
int cursorPos = myTextArea.getCaretPosition();
//实例化一个Match类的对象
Match myClass = new Match();
//下面的if语句处理单击“查找”按钮事件
if (myBTN.getLabel() == "查找") {
//通过调用Match类的方法strFind计算出字符串匹配的次数
matchNum = myClass.strFind(myString1, myString2, cursorPos);
//下面的一行语句重新设置对话框上Label对象的文本内容
textLab.setText("共找到" + matchNum + "处");
myDialog.show();
}
//接下来的if语句处理单击“替换”按钮事件
if (myBTN.getLabel() == "替换") {
//变量myString3获得第二个文本框中的字符串
String myString3 = myTextField2.getText();
//通过调用Match类中的strReplace按钮计算字符串匹配次数
matchNum = myClass.strReplace(myString1, myString2, myString3,
cursorPos);
//重新设置对话框上Label对象的文本内容
textLab.setText("共替换" + matchNum + "处");
//下面的语句用于刷新字符串替换后文本区域的文字显示
StringBuffer taText = myClass.repStr;
myTextArea.setText(taText.toString());
myDialog.show();
}
}
//下面的if语句用于处理事件源为确认按钮时的情况
if (myBTN.getLabel() == "确认") {
//单击确认按钮后,信息提示对话框消失,主界面显示
myDialog.hide();
myFrame.show();
}
}
//下面的语句重写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) {
}
}
/** 类Match用于处理有关字符串查找和替换算法 */
class Match {
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -