一、介绍
总共有4个按钮的功能要实现:查找下一个、替换、全部替换和取消,筛选条件为是否区分大小写、查找方向为向上或向下。相较电脑自带记事本少了循环选项,多了查找方向。
查找下一个按钮和取消功能与查找窗口的相同,这里不再复述,如有需要,可点击下方链接学习
java记事本实现查找功能
替换按钮与电脑自带记事本中的功能相同,替换了当前匹配元素后,自动查找并显示下一个匹配元素;若自主选中元素与查找内容相匹配就替换,不匹配则查找并显示下一个匹配元素。
替换全部按钮与电脑自带记事本中的有所不同,电脑中的是将文本区域中与查找内容相匹配的全部元素替换。本文的是选中向上按钮则将光标所在位置之前的所有匹配元素替换,选中向下按钮则将光标所在位置之后的所有匹配元素替换。
各部分组件的生成如下:
JTextArea jtext = new JTextArea();//记事本的文本区域
JButton replaceButton=new JButton("替换(R)");//替换按钮
JButton replaceAllButton=new JButton("全部替换(A)");
JTextField findText1=new JTextField(15);//查找内容输入单行文本框
JTextField replaceText=new JTextField(15);//替换内容输入单行文本框
JCheckBox matchCheckBox1=new JCheckBox("区分大小写(C)");//复选框
ButtonGroup bGroup=new ButtonGroup();
JRadioButton upButton1=new JRadioButton("向上(U)");//单选按钮
JRadioButton downButton1=new JRadioButton("向下(U)");
downButton1.setSelected(true);//默认选中向下按钮
bGroup.add(upButton1);
bGroup.add(downButton1);
//ButtonGroup中的JRadioButton只能选择一个
二、替换
首先为替换按钮设置点击事件命令和事件监听器
replaceButton.setActionCommand("replace");
replaceButton.addActionListener(menuhandler);
其中事件监听器的定义如下,相当于对点击事件的处理
public class MenuHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e){
String actionCommand = e.getActionCommand();//获取触发事件的命令
if("replace".equals(actionCommand){
/*如果触发事件命令与我们为替换按钮设置的命令相同
那么我们就要执行这一部分所写的操作
*/
}
}
}
替换操作只需要两行代码即可(为方便读者查看,变三行了…………)
if(jtext.getSelectedText()!=null&&
jtext.getSelectedText().equals(findText1.getText()))
jtext.replaceSelection(replaceText.getText());
在此解释if语句中的两个条件:第一点,如果在文本区域还没选中元素肯定是不能替换的。第二点,如果选中的元素是通过查找得来的,那么肯定与查找内容文本框中的文本相同,可以替换;如果选中的元素是自主选择的,那么与要查找内容可能相同,可能不同,相同就替换,不同就不能替换。如果想让选中的元素无论与查找内容匹配与否都替换,可以删除第二点。
getText函数是获取文本框中的文本,replaceSelection函数是用传入文本替换文本区域选中的文本。另外需要注意的是,在java中判断两个字符串是否相同需要使用equals函数,而不能用”==“。
当前没选中文本或替换之后要显示下一个匹配的元素,本质就是进行一次查找下一个或查找上一个操作,实现与解释在java记事本实现查找功能中有详细说明,这里仅粘贴实现代码方便查看,便不再赘述。
int k=0;
String str1,str2,strA,strB;
boolean up,down,checkbox;
str1=jtext.getText();
str2=findText1.getText();
up=upButton1.isSelected();
down=downButton1.isSelected();
checkbox=matchCheckBox1.isSelected();
if(checkbox){
strA=str1;
strB=str2;
}
else{
strA=str1.toUpperCase();
strB=str2.toUpperCase();
}
if(down){
k=strA.indexOf(strB,jtext.getCaretPosition());
if(k>-1)
{
jtext.setCaretPosition(k);
jtext.select(k,k+strB.length());
}
else
JOptionPane.showMessageDialog(null,"找不到\""+str2+"\"","记事本",JOptionPane.INFORMATION_MESSAGE);
}
if(up){
if(jtext.getSelectedText()==null)
k=strA.lastIndexOf(strB,jtext.getCaretPosition()-1);
else
k=strA.lastIndexOf(strB, jtext.getCaretPosition()-strB.length()-1);
if(k>-1)//查找内容存在
{
jtext.setCaretPosition(k);//设置光标位置
jtext.select(k,k+strB.length());//选中内容,此时光标位置后移了strB.length()长度
}
else
JOptionPane.showMessageDialog(null,"找不到\""+str2+"\"","记事本",JOptionPane.INFORMATION_MESSAGE);
}
三、全部替换
全部替换相当于一直点击查找按钮,查到一个匹配的元素替换一个,直到不存在匹配内容。因此,只要在查找的基础上套一层循环并增加对匹配内容的替换和个数统计就可以实现。
String str1,str2,strA,strB;
boolean up,down,checkbox;
str1=jtext.getText();
str2=findText1.getText();
up=upButton1.isSelected();
down=downButton1.isSelected();
checkbox=matchCheckBox1.isSelected();
if(checkbox)//区分大小写
{ strA=str1;
strB=str2;
}
else//不区分大小写,此时把所选内容全部化成大写,以便于查找
{ strA=str1.toUpperCase();
strB=str2.toUpperCase();
}
int k=0,replaceCount=0;
if(findText1.getText().length()==0)//查找框没有输入内容弹出提示
{ JOptionPane.showMessageDialog(replaceDialog,"请填写查找内容!","提示",JOptionPane.WARNING_MESSAGE);
findText1.requestFocus(true);//查找框获取焦点
return;
}
while(k>-1)//当文本中有内容被选中时(k>-1被选中)进行替换
{
if(up)
{
if(jtext.getSelectedText()==null)
k=strA.lastIndexOf(strB,jtext.getCaretPosition()-1);
else
k=strA.lastIndexOf(strB,jtext.getCaretPosition()-strB.length()-1);
if(k>-1)
{
jtext.setCaretPosition(k);
jtext.select(k,k+strB.length());
}
else
{ if(replaceCount==0)
JOptionPane.showMessageDialog(replaceDialog, "找不到\""+str2+"\"", "记事本",JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(replaceDialog,"成功替换了"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);
}
}
else if(down)
{
k=strA.indexOf(strB,jtext.getCaretPosition());
if(k>-1)
{
jtext.setCaretPosition(k);
jtext.select(k,k+strB.length());
}
else
{ if(replaceCount==0)
JOptionPane.showMessageDialog(replaceDialog, "找不到\""+str2+"\"", "记事本",JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(replaceDialog,"成功替换了"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);
}
}
//将查找到的元素替换掉
if(jtext.getSelectedText()!=null &&
jtext.getSelectedText().equals(findText1.getText()))
{ jtext.replaceSelection(replaceText.getText());
replaceCount++;
}
}
对比查找按钮的点击处理,可以发现,全部替换仅多出了对查找框没有输入内容时的提醒、对查找到的元素进行替换和对替换个数的统计,此外,嵌套了一层while循环,循环条件是文本区域是否还存在可匹配元素。