Java课设——文本编辑器

article/2025/11/9 11:59:22

来自:https://blog.csdn.net/qq_39169598/article/details/84726959

原创不易,转载请加上作者

一、需求

编程实现一个文本编辑器,使其具有新建、打开、保存,编辑(查找、替换、大小写转换等)、统计(字数、行数、字符数等)、格式(字体设置、字体大小、字体颜色、背景颜色等)等功能。
要求:基于JFrame窗体设计、使用菜单进行功能选择。

二、工程目录

工程目录图

三、项目代码

TestGui类

package T_1029;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class TestGui extends JFrame {private static final long serialVersionUID = 1L;private int flagFile=0;public TestGui() {JFrame f = new JFrame("文本编辑器");f.setSize(800, 600);f.setLocation(200, 200);JMenuBar mb = new JMenuBar();//菜单栏JMenu mFile = new JMenu("文件 (F)");mFile.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));JMenu mEdit = new JMenu("编辑 (E)");mEdit.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));JMenu mForm = new JMenu("格式 (O)");mForm.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));JMenu mHelp = new JMenu("帮助 (H)");mHelp.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));// 菜单项JMenuItem NewFile =new JMenuItem("新建(N)");NewFile.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mFile.add(NewFile);JMenuItem OpenFile=new JMenuItem("打开(O)");OpenFile.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mFile.add(OpenFile);JMenuItem SaveFile=new JMenuItem("保存(S)");SaveFile.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mFile.add(SaveFile);JMenuItem Search=new JMenuItem("查找(F)");Search.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mEdit.add(Search);JMenuItem Replace=new JMenuItem("替换(G)");Replace.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mEdit.add(Replace);JCheckBoxMenuItem FontChange=new JCheckBoxMenuItem("大小写转换(R)");FontChange.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mEdit.add(FontChange);JMenuItem FontCount=new JMenuItem("统计(C)");FontCount.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mEdit.add(FontCount);JMenuItem SetFont=new JMenuItem("字体设置");SetFont.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mForm.add(SetFont);JMenuItem SetBackColor=new JMenuItem("设置背景颜色");SetBackColor.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mForm.add(SetBackColor);JMenuItem About=new JMenuItem("关于文本编辑器");About.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));mHelp.add(About);JTextArea textArea = new JTextArea();//文本框自动换行textArea.setLineWrap(true);//设置文本框字体textArea.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 26));JPanel panel = new JPanel(new BorderLayout());//使用边界布局JLabel label=new JLabel(" ");label.setHorizontalAlignment(label.RIGHT);//右对齐panel.add(label,BorderLayout.SOUTH);//向窗口添加状态栏标签//实例化滚动面板JScrollPane scrollPane = new JScrollPane();//显示垂直滚动条scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//文本框填入滚动面板scrollPane.setViewportView(textArea);//动态面板添加入窗口f.getContentPane().add(scrollPane);panel.add(scrollPane,BorderLayout.CENTER);f.setContentPane(panel);f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置文本框内容改变的监听器textArea.getDocument().addDocumentListener(new DocumentListener() {@Overridepublic void removeUpdate(DocumentEvent e) {flagFile=1;}@Overridepublic void insertUpdate(DocumentEvent e) {flagFile=1;}@Overridepublic void changedUpdate(DocumentEvent e) {// TODO 自动生成的方法存根}});//查找的监听器Search.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new HSearchText(f,textArea);}});//替换的监听器Replace.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new HReplaceText(f,textArea);}});//新建文件的监听器NewFile.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {HFile hFile=new HFile();if(flagFile==1){int result=JOptionPane.showConfirmDialog(f, "是否保存更改?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);if(result==JOptionPane.OK_OPTION){hFile.saveFile(f, textArea);//另存为 }else if(result==JOptionPane.NO_OPTION){textArea.setText("");}flagFile=0;}else {textArea.setText("");f.setTitle("新建记事本");}}});//打开文件的监听器OpenFile.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {HFile hFile=new HFile();if(flagFile==1) {int result=JOptionPane.showConfirmDialog(f, "是否保存更改?", "记事本-保存", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);if(result==JOptionPane.OK_OPTION){hFile.saveFile(f, textArea);flagFile=0;}else if(result==JOptionPane.NO_OPTION)	flagFile=0;}else if(flagFile==0) {hFile.openFile(f, textArea);}}});//保存文件的监听器SaveFile.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new HFile().saveFile(f, textArea);flagFile=0;}});//统计的监听器FontCount.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new HFontCount(textArea);	}});//字体设置的监听器SetFont.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new HSetFont(f,textArea);}});//大小写转换的监听器FontChange.addChangeListener(new ChangeListener() {@Overridepublic void stateChanged(ChangeEvent e) {if(FontChange.isSelected()) {String string=textArea.getText();char[] chars = string.toCharArray();for (int i = 0, length = chars.length; i < length; i++) {char c = chars[i];//判断字母是不是大写,如果是大写变为小写if (Character.isUpperCase(c)){chars[i] = Character.toLowerCase(c);continue;}//如果为小写,变为大写chars[i] = Character.toUpperCase(c);}String str1 = new String(chars);textArea.setText(str1);}}});//设置背景颜色的监听器SetBackColor.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Color color = JColorChooser.showDialog(f, "选取颜色", null);// 如果用户取消或关闭窗口, 则返回的 color 为 nullif (color == null) {return;}textArea.setBackground(color);}});//关于文本编辑器的监听器About.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {JFrame f = new JFrame("关于文本编辑器");//弹出无提示图片的消息窗口JOptionPane.showMessageDialog(f,"JAVA课设\nMake By d幻月b","文本编辑器",JOptionPane.PLAIN_MESSAGE);}});//窗口关闭的监听器,提示保存f.addWindowListener(new WindowAdapter() {@Overridepublic void windowOpened(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowIconified(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowDeiconified(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowDeactivated(WindowEvent e) {// TODO 自动生成的方法存根}@Overridepublic void windowClosing(WindowEvent e) {HFile hFile=new HFile();if(flagFile==1){int result=JOptionPane.showConfirmDialog(f, "是否将更改保存到新建记事本?", "记事本", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);if(result==JOptionPane.OK_OPTION){hFile.saveFile(f, textArea);//另存为 flagFile=0;}}}@Overridepublic void windowClosed(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {// TODO 自动生成的方法存根}});textArea.addKeyListener(new KeyAdapter() {//按下某键public void keyPressed(KeyEvent e) {int row = 0;int col = 0;int pos = textArea.getCaretPosition(); //获得光标位置            try {row = textArea.getLineOfOffset(pos) + 1; //返回行从0算起,要+1col = pos-textArea.getLineStartOffset(row-1)+1; }catch(Exception exception) {}label.setText("第" + row+"行," +"第"+col+"列      " ); }// 释放某键public void keyReleased(KeyEvent e) {int row = 0;int col = 0;int pos = textArea.getCaretPosition(); //获得光标位置            try {row = textArea.getLineOfOffset(pos) + 1; //返回行从0算起,要+1col = pos-textArea.getLineStartOffset(row-1)+1; }catch(Exception exception) {}label.setText("第" + row+"行," +"第"+col+"列      " ); }});//新建文件的快捷键NewFile.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N,java.awt.Event.CTRL_MASK));NewFile.setMnemonic('N');//打开文件的快捷键OpenFile.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O,java.awt.Event.CTRL_MASK));OpenFile.setMnemonic('O');//保存文件的快捷键SaveFile.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S,java.awt.Event.CTRL_MASK));SaveFile.setMnemonic('S');//统计字数的快捷键FontCount.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.Event.ALT_MASK));FontCount.setMnemonic('C');//查找的快捷键Search.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F,java.awt.Event.CTRL_MASK));Search.setMnemonic('F');//替换的快捷键Replace.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G,java.awt.Event.CTRL_MASK));Replace.setMnemonic('G');//大小写转换的快捷键FontChange.setAccelerator(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R,java.awt.Event.CTRL_MASK));FontChange.setMnemonic('R');//载入4个一级菜单mb.add(mFile);mb.add(mEdit);mb.add(mForm);mb.add(mHelp);f.setJMenuBar(mb);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setVisible(true);}public static void main(String[] args) {new TestGui();}
}

HFile类

package T_1029;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;public class HFile {public void openFile(JFrame f,JTextArea textArea) {// 创建一个默认的文件选取器JFileChooser fileChooser = new JFileChooser();// 设置默认显示的文件夹为当前文件夹fileChooser.setCurrentDirectory(new File("."));// 设置文件选择的模式(只选文件、只选文件夹、文件和文件均可选)fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);// 设置是否允许多选fileChooser.setMultiSelectionEnabled(false);// 设置默认使用的文件过滤器fileChooser.setFileFilter(new FileNameExtensionFilter("txt(*.txt)", "txt"));// 打开文件选择框int result = fileChooser.showOpenDialog(f);if(result==1)return ;if (result == JFileChooser.APPROVE_OPTION) {try {  textArea.setText("");File file = fileChooser.getSelectedFile();FileInputStream fis=new FileInputStream(file);try{//读取数据,并将读取到的数据存储到数组中byte[] data = new byte[1024]; //数据存储的数组int i = fis.read(data);//解析数据String s = new String(data,0,i);textArea.append(s);}catch(Exception e){e.printStackTrace();}finally{try{fis.close();}catch(Exception e){}}f.setTitle(file.getName()+" - 文本编辑器");} catch (IOException e) {e.printStackTrace();}}}public void saveFile(JFrame f,JTextArea textArea) {// 创建一个默认的文件选取器JFileChooser fileChooser = new JFileChooser();// 设置默认显示的文件夹为当前文件夹fileChooser.setCurrentDirectory(new File("."));// 设置打开文件选择框后默认输入的文件名fileChooser.setSelectedFile(new File("新建记事本.txt"));// 打开文件选择框int select = fileChooser.showSaveDialog(f);if (select == JFileChooser.APPROVE_OPTION) {// 保存文本内容File file = fileChooser.getSelectedFile();try {//覆盖文件式写入OutputStream outToFileEnd = new FileOutputStream(file);String string = textArea.getText();byte[] bs = string.getBytes();outToFileEnd.write(bs);outToFileEnd.close();f.setTitle(file.getName()+" - 文本编辑器");} catch (Exception e1) {e1.printStackTrace();}}}
}

HFontCount类

package T_1029;
import java.awt.Font;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class HFontCount {public HFontCount(JTextArea textArea){String line=textArea.getText();JFrame f = new JFrame("统计");//弹出无提示图片的消息窗口JOptionPane.showMessageDialog(f,"字数:"+countChinese(line)+"\n字符数:"+line.length()+"\n行数:"+textArea.getLineCount(),"统计",JOptionPane.PLAIN_MESSAGE);}public static int countChinese(String str) {int count = 0;//正则表达式匹配汉字|全角符号|数字|。|英文字母Pattern p = Pattern.compile("[\\u4e00-\\u9fa5]|[\\uFE30-\\uFFA0]|[0-9]|[\\u3001-\\u3002]|[a-zA-Z]");Matcher m = p.matcher(str);while(m.find()){count++;}return count;} 
}

HReplaceText类

package T_1029;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class HReplaceText {public HReplaceText(JFrame f,JTextArea textArea) {JDialog jdlg = new JDialog(f, "替换", true);jdlg.setSize(453, 200);jdlg.setLocationRelativeTo(null);jdlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);JPanel panel=new JPanel();panel.setLayout(null);JLabel label=new JLabel("查找内容:");JLabel label2=new JLabel("替换为:");JLabel count=new JLabel("找到0个");JTextArea ftext=new JTextArea();JTextArea rtext=new JTextArea();JButton findnext=new JButton("查找下一个");JButton replace=new JButton("替换");JButton allreplace=new JButton("全部替换");JButton no=new JButton("取消");JCheckBox matchcase=new JCheckBox("区分大小写");//创建两个单选按钮JRadioButton up = new JRadioButton("向上替换");JRadioButton down = new JRadioButton("向下替换");//创建按钮组,把两个单选按钮添加到该组ButtonGroup btnGroup = new ButtonGroup();btnGroup.add(up);btnGroup.add(down);// 设置第一个单选按钮选中up.setSelected(true);label.setBounds(20,20,93,22);label2.setBounds(20,45,93,22);count.setBounds(20, 55, 80, 85);ftext.setBounds(100,20,200,22);rtext.setBounds(100,48,200,22);findnext.setBounds(320, 18, 105, 32);replace.setBounds(320, 55, 105, 32);allreplace.setBounds(320, 92, 105, 32);no.setBounds(320, 128, 105, 32);matchcase.setBounds(15, 120, 100, 55);up.setBounds(130, 120, 80, 55);down.setBounds(230, 120, 80, 55);//初始化按键状态findnext.setEnabled(false);replace.setEnabled(false);allreplace.setEnabled(false);//查找文本框的监听器,改变按钮状态ftext.getDocument().addDocumentListener(new DocumentListener() {@Overridepublic void removeUpdate(DocumentEvent e) {if(ftext.getText().equals("")) {findnext.setEnabled(false);replace.setEnabled(false);allreplace.setEnabled(false);}}@Overridepublic void insertUpdate(DocumentEvent e) {findnext.setEnabled(true);replace.setEnabled(true);allreplace.setEnabled(true);}@Overridepublic void changedUpdate(DocumentEvent e) {// TODO 自动生成的方法存根}});//查找下一个的监听器findnext.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int c=0;int a = 0, b = 0;int FindStartPos = textArea.getCaretPosition();String strA,strB;// 选中区分大小写,大小写转换if (matchcase.isSelected()) {strA = textArea.getText();strB = ftext.getText();} else {strA = textArea.getText().toLowerCase();strB = ftext.getText().toLowerCase();}//向上查找,否则向下查找if (up.isSelected()) {a = strA.lastIndexOf(strB, FindStartPos - ftext.getText().length() - 1);} else if (down.isSelected()) {a = strA.indexOf(strB, FindStartPos - ftext.getText().length() + 1);}//查找到边界if (a > -1) {if (up.isSelected()) {textArea.setCaretPosition(a);b = ftext.getText().length();textArea.select(a, a + b);} else if (down.isSelected()) {textArea.setCaretPosition(a);b = ftext.getText().length();textArea.select(a, a + b);}} else {JOptionPane.showMessageDialog(null, "找不到查找的内容", "查找", JOptionPane.INFORMATION_MESSAGE);}//显示关键字的总数量Pattern p=Pattern.compile(ftext.getText());Matcher m=p.matcher(textArea.getText());while(m.find()) {c++;}count.setText("找到"+c+"个");}});//替换的监听器replace.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (rtext.getText().length() == 0 && textArea.getSelectedText() != null) {textArea.replaceSelection("");}if (rtext.getText().length() > 0 && textArea.getSelectedText() != null) {textArea.replaceSelection(rtext.getText());}}});//替换全部的监听器allreplace.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//显示关键字的总数量int c=0;Pattern p=Pattern.compile(ftext.getText());Matcher m=p.matcher(textArea.getText());while(m.find()) {c++;}count.setText("替换"+c+"个");//替换全部关键字String str=textArea.getText();str=str.replace(ftext.getText(), rtext.getText());textArea.setText(str);}});//取消的监听器no.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jdlg.setVisible(false);}});label.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));label2.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));count.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));ftext.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));rtext.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));findnext.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));replace.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));allreplace.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));no.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));panel.add(label);panel.add(label2);panel.add(count);panel.add(ftext);panel.add(rtext);panel.add(findnext);panel.add(no);panel.add(replace);panel.add(allreplace);panel.add(matchcase);panel.add(up);panel.add(down);jdlg.setResizable(false);jdlg.setContentPane(panel);jdlg.setVisible(true);}
}

HSearchText类

package T_1029;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class HSearchText {public HSearchText(JFrame f,JTextArea textArea) {JDialog jdlg = new JDialog(f, "查找", true);jdlg.setSize(453, 150);jdlg.setLocationRelativeTo(null);jdlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);JPanel panel=new JPanel();panel.setLayout(null);JLabel label=new JLabel("查找内容:");JLabel count=new JLabel("找到0个");JTextArea ftext=new JTextArea();JButton findnext=new JButton("查找下一个");JButton no=new JButton("取消");JCheckBox matchcase=new JCheckBox("区分大小写");//创建两个单选按钮JRadioButton up = new JRadioButton("向上查找");JRadioButton down = new JRadioButton("向下查找");//创建按钮组,把两个单选按钮添加到该组ButtonGroup btnGroup = new ButtonGroup();btnGroup.add(up);btnGroup.add(down);// 设置第一个单选按钮选中up.setSelected(true);label.setBounds(20,20,93,22);count.setBounds(20, 55, 80, 35);ftext.setBounds(100,20,200,22);findnext.setBounds(320, 18, 105, 32);no.setBounds(320, 53, 105, 32);matchcase.setBounds(15, 90, 100, 25);up.setBounds(130, 90, 80, 25);down.setBounds(230, 90, 80, 25);//初始化查找按键findnext.setEnabled(false);//设置文本框和按钮的状态ftext.getDocument().addDocumentListener(new DocumentListener() {@Overridepublic void removeUpdate(DocumentEvent e) {if(ftext.getText().equals(""))findnext.setEnabled(false);}@Overridepublic void insertUpdate(DocumentEvent e) {findnext.setEnabled(true);}@Overridepublic void changedUpdate(DocumentEvent e) {// TODO 自动生成的方法存根}});//查找下一个的监听器findnext.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int c=0;int a = 0, b = 0;int FindStartPos = textArea.getCaretPosition();String strA,strB;// 选中区分大小写,大小写转换if (matchcase.isSelected()) {strA = textArea.getText();strB = ftext.getText();} else {strA = textArea.getText().toLowerCase();strB = ftext.getText().toLowerCase();}//向上查找,否则向下查找if (up.isSelected()) {a = strA.lastIndexOf(strB, FindStartPos - ftext.getText().length() - 1);} else if (down.isSelected()) {a = strA.indexOf(strB, FindStartPos - ftext.getText().length() + 1);}//查找到边界if (a > -1) {if (up.isSelected()) {textArea.setCaretPosition(a);b = ftext.getText().length();textArea.select(a, a + b);} else if (down.isSelected()) {textArea.setCaretPosition(a);b = ftext.getText().length();textArea.select(a, a + b);}} else {JOptionPane.showMessageDialog(null, "找不到查找的内容", "查找", JOptionPane.INFORMATION_MESSAGE);}//显示关键字的总数量Pattern p=Pattern.compile(ftext.getText());Matcher m=p.matcher(textArea.getText());while(m.find()) {c++;}count.setText("找到"+c+"个");}});//取消的监听器no.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jdlg.setVisible(false);}});label.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));count.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));ftext.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));findnext.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));no.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));panel.add(label);panel.add(count);panel.add(ftext);panel.add(findnext);panel.add(no);panel.add(matchcase);panel.add(up);panel.add(down);jdlg.setResizable(false);jdlg.setContentPane(panel);jdlg.setVisible(true);}
}

HSetFont类

package T_1029;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class HSetFont extends JDialog{public HSetFont(JFrame f,JTextArea textArea) {//获取系统字体库GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();String[] fontNames = e.getAvailableFontFamilyNames();String[] fontStyle=new String[]{"常规","粗体","斜体","粗斜体"};Integer[] fontsize=new Integer[] {8,9,10,11,12,13,14,16,18,20,22,24,26,28,30,32,36,48,72};JDialog jdlg = new JDialog(f, "字体设置", true);jdlg.setSize(453, 325);jdlg.setLocationRelativeTo(null);jdlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);JPanel panel=new JPanel();panel.setLayout(null);JButton yes=new JButton("确定");JButton no=new JButton("取消");JButton setfontcolor=new JButton("字体颜色");JLabel fonts=new JLabel("字体:");JLabel style=new JLabel("样式:");JLabel size=new JLabel("大小:");JLabel cg=new JLabel("AaBbCc");// 创建下拉列表框final JComboBox<String> comboBox = new JComboBox<String>(fontNames);final JComboBox<String> comboBox2=new JComboBox<String>(fontStyle);final JComboBox<Integer> comboBox3=new JComboBox<Integer>(fontsize);// 添加条目选中状态改变的监听器comboBox.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {// 只处理选中的状态if (e.getStateChange() == ItemEvent.SELECTED) {cg.setFont(new Font((String) comboBox.getSelectedItem(), cg.getFont().getStyle(), cg.getFont().getSize()));}}});comboBox2.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent e) {if(e.getStateChange()==ItemEvent.SELECTED) {if(comboBox2.getSelectedItem().equals("常规")) {cg.setFont(new Font(cg.getFont().getName(), Font.PLAIN, cg.getFont().getSize()));}else if(comboBox2.getSelectedItem().equals("粗体")){cg.setFont(new Font(cg.getFont().getName(), Font.BOLD, cg.getFont().getSize()));}else if(comboBox2.getSelectedItem().equals("斜体")){cg.setFont(new Font(cg.getFont().getName(), Font.ITALIC, cg.getFont().getSize()));}else if(comboBox2.getSelectedItem().equals("粗斜体")) {cg.setFont(new Font(cg.getFont().getName(), Font.BOLD+ Font.ITALIC, cg.getFont().getSize()));}}}});comboBox3.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent e) {if(e.getStateChange()==ItemEvent.SELECTED) {cg.setFont(new Font(cg.getFont().getName(), cg.getFont().getStyle(), (int) comboBox3.getSelectedItem()));}}});setfontcolor.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Color color = JColorChooser.showDialog(f, "选取颜色", null);// 如果用户取消或关闭窗口, 则返回的 color 为 nullif (color == null) {return;}textArea.setForeground(color);}});yes.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {textArea.setFont(cg.getFont());jdlg.setVisible(false);}});no.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {jdlg.setVisible(false);}});//设置元件位置和宽高fonts.setBounds(20,20,45,18);style.setBounds(190,20,45,18);size.setBounds(313,20,45,18);comboBox.setBounds(20,42,170,22);comboBox2.setBounds(190,42,119,22);comboBox3.setBounds(309, 42, 119, 22);cg.setBounds(30,89,378,137);setfontcolor.setBounds(20,249,102,30);yes.setBounds(300,249,62,30);no.setBounds(366,249,62,30);fonts.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));style.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));size.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));cg.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 12));setfontcolor.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 12));yes.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));no.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 13));comboBox.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));comboBox2.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));comboBox3.setFont(new Font("Microsoft YaHei UI", Font.PLAIN, 16));// 设置字体下拉框为文本框的字体样式comboBox.setSelectedItem(textArea.getFont().getFontName());comboBox3.setSelectedItem(textArea.getFont().getSize());comboBox2.setSelectedIndex(textArea.getFont().getStyle());// 添加到内容面板panel.add(fonts);panel.add(style);panel.add(size);panel.add(comboBox);panel.add(comboBox2);panel.add(comboBox3);panel.add(setfontcolor);panel.add(yes);panel.add(no);panel.add(cg);jdlg.setResizable(false);jdlg.setContentPane(panel);jdlg.setVisible(true);    }
}

四、效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/mhbq2J9t.shtml

相关文章

用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行

Java做文本编辑器的项目&#xff0c;搜了下看到网上有各种版本的Java文本编辑器有很多种&#xff0c;但有的实现很麻烦&#xff0c;最近刚好在做这个实现就也发一个&#xff0c;代码写得很朴素&#xff0c;注释无比详细。 测试过没有Bug&#xff0c;如果有什么问题&#xff0c…

Java实现简单的文本编辑器

1、首先创建一个编辑器EditorDemo类&#xff0c;继承JFrame类&#xff0c;具体实现编码如下&#xff1a; 2、创建菜单栏&#xff0c;新增各个菜单项&#xff0c;比如文件、编辑、帮助等功能&#xff0c;新增createJMenuBar方法如下&#xff1a; /*** 创建菜单栏* param acti…

你知道在深圳一个月花多少钱吗?

在深圳一个月花多少钱&#xff0c;才能活得比较像样&#xff1f; 早上上班挤地铁转公共&#xff0c;7到10块钱&#xff0c;中午在公司叫一份外卖&#xff0c;22块钱到30块钱&#xff0c;晚上加班和同事一起吃饭&#xff0c;25块左右&#xff0c;赶上末班地铁7块钱&#xff0c;房…

开发一个app需要多少钱

APP应用开发主要分为原生APP和HTML5APP开发&#xff0c;使用HTML5开发的app价格不是很高&#xff0c;但是在体验上&#xff0c;访问速度上比原生的有差距。 第一、商城类app报价计算 以H5的封装案例&#xff0c;价格比较便宜&#xff0c;商城价格几万就能搞定&#xff0c;不会超…

一般培训python要多少钱

Python语言相对简单并且非常适合初学者&#xff0c;使初学者可以专注于编程逻辑&#xff0c;而不会陷入晦涩的语法细节中。 学习python提供了比其他任何编程语言更多的职业发展选择。 那么&#xff0c;python培训班一般要多少钱&#xff1f; 伴随着互联网技术的迅猛发展&…

微信小程序开发一个多少钱

小程序开发是当前比较流行的一项技术服务&#xff0c;能够为企业和个人带来巨大的商业价值和社会价值&#xff0c;但是小程序开发费用也是潜在的成本之一。在选择小程序开发服务时&#xff0c;了解开发费用如何计算、影响价格的因素以及如何降低成本等方面的知识&#xff0c;可…

开发一个App大概要多少钱?

结合自己的各种采坑失败经验以及周边个别成功试水经验&#xff0c;站在个人角度给出一些理解。 APP制作有多种形式&#xff0c;所以需要的成本差异较大。 1.寻找外包公司 2.模板APP&#xff08;内行叫SAAS&#xff09; 3.自己组建团队 目录 互联网外包公司的成本构成&#…

chatgpt赋能python:如何让Python暂停?

如何让Python暂停&#xff1f; Python是一种高级编程语言&#xff0c;常用于数据分析、机器学习等领域。在Python编程中&#xff0c;我们经常需要让程序执行暂停一段时间&#xff0c;等待某些操作完成。本文将介绍如何让Python暂停&#xff0c;以及如何在SEO中优化文章标题&am…

独家 | ChatGPT可以解决分级和分类这样的简单机器学习任务

作者&#xff1a;Damir Yalalov 翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约1100字&#xff0c;建议阅读5分钟 本文介绍了ChatGPT如何解决简单的机器学习任务并给出了鸢尾花分类和城市预测两个案例。 一句话概括&#xff1a; ChatGPT可以帮助你完成简单的机器学习任务…

分享 7 个不错的 AI 工具

人工智能的世界继续让我们着迷&#xff0c;近期的 OpenAI ChatGPT 掀起人们对人工智能的更大的期待&#xff0c;本文收集了 7 个人工智能 (AI) 工具&#xff0c;其中大部分易于使用&#xff0c;有些更复杂……比如构建 ML 模型。 1. GFP-GAN&#xff1a;照片修复 GFP-GAN 是一…

你们怎么都有自己的聊天机器人?给我也来一个!

点击左上方蓝字关注我们 PaddlePaddle Wechaty AI ChatBot创意赛正在火热进行中&#xff0c;人工智能时代的ChatBot需要具备哪些能力&#xff1f;由你来定义&#xff01;参赛的小伙伴们果然各显神通&#xff0c;快来pick你心中最中意的聊天机器人吧&#xff0c;并献上你珍贵的…

【AI绘画打卡】| 用漫画生成器绘制宅男最爱的二次元美女

二次元美女在日本文化中已经成为一种流行文化和艺术形式&#xff0c;包括漫画、动画等。由于此类作品的富有想象力、多样性和虚构&#xff0c;像二次元美女这样的虚拟角色往往可以充分满足人们的幻想和情感需求。这也是许多宅男在二次元世界寻找自己理想女友的原因之一。 作品…

进程地址空间详解

进程地址空间 文章目录 进程地址空间验证地址空间的基本排布进程地址空间究竟是什么&#xff1f; 地址空间和物理内存之间的关系为什么要存在地址空间&#xff1f; 我们在学习C语言期间&#xff0c;经常可以提及到这些区域&#xff0c;有一个问题&#xff1a;这里的地址空间是内…

【GlobalMapper精品教程】044:空间操作(1)——交集(Intersection)

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述交集工具的使用。 文章目录 一、实验数据二、符号化设置三、交集运算四、结果展示1. 运行提示2. 空间查看3. 属性表查看五、心灵感…

PostgreSQL的表空间

PostgreSQL之表空间 1、什么是PG中的表空间&#xff08;tablespace&#xff09;&#xff1f; pg中的表空间实际上就是文件系统中的一个目录, 是pg中数据库对象&#xff08;包括表、索引等&#xff09;的容器。 Pg使用操作系统的文件系统进行对象存储&#xff0c;每个数据库对…

Oracle表空间、用户详解

目录 新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态 删除表空间查询 用户创建删除查询修改 新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c…

49-Linux_malloc及4G虚拟空间分布

文章目录 malloc及4G虚拟空间分布1.malloc2.32位操作系统进程的4G虚拟空间分布1) 代码区(Text egment)&#xff1a;2) 全局初始化数据区/静态数据区(Data Segment)3) 未初始化数据区(BSS)&#xff1a;4) 堆区(heap)&#xff1a;5) 栈区(stack)&#xff1a; malloc及4G虚拟空间分…

(微信开发)Laya转发H5网页到微信,带图片

网页转发到微信时&#xff0c;带图片和自定义标题。2022年11月22号 关键解说 _wx.config({ debug: _wx_configdebug, appId: e.appId, timestamp: e.timestamp, nonceStr: e.nonceStr, signature: e.signature, jsApiList: [ // 所有要调用的 API 都要加到这个列表中 ‘onMen…

移动端H5页面开发的几种方法

单位&#xff1a; px 宽度百分比&#xff0c;高度px 在不同屏幕下的效果是不一样的&#xff0c;可用媒体查询&#xff08;media&#xff09;对不同宽度的手机进行适配&#xff0c;麻烦&#xff0c;不推荐使用 单位&#xff1a;rem 1、flexible 用法&#xff1a;https://blog.c…

H5页面调用微信支付

1、H5页面使用微信支付&#xff0c;首先需要注册微信公众号&#xff0c;在设置与开发>公众号设置>功能设置中配置业务域名、JS接口安全域名、网页授权域名。支付功能页面需在此域名链接下的页面。 2、加入域名后&#xff0c;就可以在H5页面调用微信支付功能。首先请求后台…