1 package peng_jun;
  2 
  3 import java.awt.*;
  4 import java.awt.event.*;
  5 
  6 import javax.swing.*;
  7 
  8 import java.io.*;
  9 
 10 import javax.swing.filechooser.*;
 11 
 12 import java.awt.datatransfer.*;
 13 
 14 public class Text4 extends JFrame {
 15     public static void main(String[] args) throws Exception {
 16         new Text4();
 17     }
 18 
 19     JTextArea area = new JTextArea();;// 文本域
 20     String name = null;// 文件名
 21     String board = null;
 22     Clipboard cb;// 系统粘贴板 此类实现一种使用剪切/复制/粘贴操作传输数据的机制
 23 
 24     JMenu font = new JMenu("字体");
 25     JMenuItem bold = new JMenuItem("加粗");
 26     JMenuItem italics = new JMenuItem("斜体");
 27     JMenu size = new JMenu("字号");
 28     JMenuItem size_18 = new JMenuItem("18");
 29     JMenuItem size_19 = new JMenuItem("19");
 30     JMenuItem size_20 = new JMenuItem("20");
 31     JMenuItem size_21 = new JMenuItem("21");
 32     JMenu color = new JMenu("颜色");
 33     JMenuItem red = new JMenuItem("红色");
 34     JMenuItem blue = new JMenuItem("蓝色");
 35 
 36     JMenu file = new JMenu("文件");// 定义“文件”菜单项
 37     JMenuItem rebuild = new JMenuItem("新建");
 38     JMenuItem save = new JMenuItem("保存");
 39     JMenuItem open = new JMenuItem("打开");
 40     JMenuItem anotherSave = new JMenuItem("另存为");
 41     JMenuItem clear = new JMenuItem("清除");
 42     JMenuItem close = new JMenuItem("退出");
 43 
 44     JMenu edit = new JMenu("编辑");// 定义“编辑”菜单项
 45     JMenuItem cut = new JMenuItem("剪切");
 46     JMenuItem copy = new JMenuItem("复制");
 47     JMenuItem plaster = new JMenuItem("粘贴");
 48     JMenuItem all = new JMenuItem("全选");
 49     JMenuItem replice = new JMenuItem("替换");
 50     JMenuItem check = new JMenuItem("查找");
 51 
 52     JMenu help = new JMenu("帮助");// 定义“帮助”菜单项
 53     JMenuItem about = new JMenuItem("关于");
 54 
 55     Toolkit kit = Toolkit.getDefaultToolkit();// Toolkit获得本机系统的屏幕的参数
 56     JMenuBar jmb = new JMenuBar();// 创建菜单条
 57 
 58     Text4() throws Exception {// 构造函数
 59         setTitle("记事本");
 60 
 61         // 设置快捷键
 62         bold.setAccelerator(KeyStroke.getKeyStroke("ctrl B"));
 63         italics.setAccelerator(KeyStroke.getKeyStroke("ctrl I"));
 64         rebuild.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
 65         save.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));
 66         copy.setAccelerator(KeyStroke.getKeyStroke("ctrl C"));
 67         open.setAccelerator(KeyStroke.getKeyStroke("ctrl O"));
 68         cut.setAccelerator(KeyStroke.getKeyStroke("ctrl X"));
 69         plaster.setAccelerator(KeyStroke.getKeyStroke("ctrl V"));
 70         all.setAccelerator(KeyStroke.getKeyStroke("ctrl A"));
 71         replice.setAccelerator(KeyStroke.getKeyStroke("ctrl H"));
 72         check.setAccelerator(KeyStroke.getKeyStroke("ctrl F"));
 73         
 74 
 75         add(jmb);
 76         setJMenuBar(jmb);// 设置菜单条
 77         add(area);
 78         file.add(rebuild);
 79         file.add(save);
 80         file.add(open);
 81         file.add(anotherSave);
 82         file.addSeparator();
 83         file.add(clear);
 84         file.add(close);
 85         // JScrollPane scroldPane=new JScrollPane(area); //设置滚动轴
 86         // add(scroldPane);
 87 
 88         edit.add(cut);
 89         edit.add(copy);
 90         edit.add(plaster);
 91         edit.add(all);
 92         edit.addSeparator();
 93         edit.add(replice);
 94         edit.add(check);
 95 
 96         font.add(bold);
 97         font.add(italics);
 98         size.add(size_18);
 99         size.add(size_19);
100         size.add(size_20);
101         size.add(size_21);
102         color.add(red);
103         color.add(blue);
104         font.add(size);
105         font.add(color);
106 
107         help.add(about);
108         // 添加事件
109         clear.addActionListener(new HandleAct());
110         close.addActionListener(new HandleAct());
111         bold.addActionListener(new HandleAct());
112         italics.addActionListener(new HandleAct());
113         size_18.addActionListener(new HandleAct());
114         size_19.addActionListener(new HandleAct());
115         size_20.addActionListener(new HandleAct());
116         size_21.addActionListener(new HandleAct());
117         red.addActionListener(new HandleAct());
118         blue.addActionListener(new HandleAct());
119         replice.addActionListener(new HandleAct());
120         check.addActionListener(new HandleAct());
121 
122         jmb.add(file);
123         jmb.add(edit);
124         jmb.add(font);
125         jmb.add(help);
126         setSize(600, 400);// 大小信息
127         // setLocation(300, 200);// 文本框位置
128         setVisible(true);
129         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
130 
131         cb = Toolkit.getDefaultToolkit().getSystemClipboard();// 调用系统剪贴板
132         save.addActionListener(new ActionListener() {
133             public void actionPerformed(ActionEvent e) {
134                 try {
135                     saveText();
136                 } catch (Exception ex) {
137                 }
138             }
139         });
140         open.addActionListener(new ActionListener() {
141             public void actionPerformed(ActionEvent e) {
142                 try {
143                     openText();
144                 } catch (Exception ex) {
145                 }
146             }
147         });
148         rebuild.addActionListener(new ActionListener() {
149             public void actionPerformed(ActionEvent e) {
150                 try {
151                     area.setText("");
152                     name = null;
153                 } catch (Exception ex) {
154                 }
155             }
156         });
157         anotherSave.addActionListener(new ActionListener() {
158             public void actionPerformed(ActionEvent e) {
159                 anotherSaveText();
160             }
161         });
162 
163         size_18.addActionListener(new ActionListener() {
164 
165             @Override
166             public void actionPerformed(ActionEvent e) {
167                 // TODO 自动生成的方法存根
168                 Font oldF = area.getFont();// 获取当前字体
169                 String name = oldF.getName();// 获取当前字体的名字
170                 area.setFont(new Font(name, oldF.getStyle(), 18));
171             }
172         });
173 
174         cut.addActionListener(new ActionListener() // 剪切
175         {
176             public void actionPerformed(ActionEvent e) {
177                 board = area.getSelectedText();
178                 cb.setContents(new StringSelection(board), null);
179                 area.replaceRange("", area.getSelectionStart(),
180                         area.getSelectionEnd());
181             }
182         });
183         copy.addActionListener(new ActionListener() // 复制
184         {
185             public void actionPerformed(ActionEvent e) {
186                 board = area.getSelectedText();
187                 cb.setContents(new StringSelection(board), null);
188             }
189         });
190         plaster.addActionListener(new ActionListener() // 粘贴
191         {
192             public void actionPerformed(ActionEvent e) {
193                 try {
194                     Transferable content = cb.getContents(null);
195                     String st = (String) content
196                             .getTransferData(DataFlavor.stringFlavor);
197                     area.replaceRange(st, area.getSelectionStart(),
198                             area.getSelectionEnd());
199                 } catch (Exception ex) {
200                 }
201             }
202         });
203         all.addActionListener(new ActionListener() // 全选
204         {
205             public void actionPerformed(ActionEvent e) {
206                 area.setSelectionStart(0);
207                 area.setSelectionEnd(area.getText().length());
208             }
209         });
210 
211         about.addActionListener(new ActionListener() {// 帮助
212             public void actionPerformed(ActionEvent e) {
213                 JFrame frame = new JFrame("关于");
214                 frame.setSize(250, 150);
215                 frame.setLocation(400, 300);
216                 JTextArea area1 = new JTextArea("java简易文本编辑器开发人员:" + '\n'
217                         + "彭军军 201321091103," + '\n' + "鲍静瑶201321091080,"
218                         + '\n' + "刘瑾 201321091081.");
219                 frame.add(area1);
220                 frame.setVisible(true);
221             }
222         });
223     }
224 
225     public void openText() // 打开
226     {
227         /*
228          * 在选择文件方法中,首先创建JFileChooser文件选择器,
229          * 使用JFileChooser类的setFileFilter()方法创建文件扩展名过滤器,再使用JFileChooser类
230          * 的setFileSelectionMode()方法设置文件选择模式为文件,
231          * 通过JFileChooser类的showOpenDialog()方法显示文件打开对话框,确定用户按下打开按钮,
232          * 而非取消按钮后,通过JFileChooser类的getSelectedFile()方法获取用户选择的文件对象,
233          * 使用JTextField类的setText()方法显示文件信息到文本框。
234          */
235         JFileChooser chooser = new JFileChooser();//创建JFileChooser文件选择器
236         FileNameExtensionFilter filter = new FileNameExtensionFilter("Files",
237                 "txt", "java","html","css","js");//文件过滤器
238         chooser.setFileFilter(filter);
239         chooser.setCurrentDirectory(new File("."));
240         int result = chooser.showOpenDialog(Text4.this);//打开当前文件夹
241         if (result == JFileChooser.APPROVE_OPTION) {//用户按下了yes
242             name = chooser.getSelectedFile().getPath();//获取文件对象
243             setTitle(name);
244             try {
245                 BufferedReader in = new BufferedReader(new FileReader(name));
246                 String line = null;
247                 String datas = "";//保存数据
248                 //用while循环来判断读取是否结束  此处用的是行读取
249                 while ((line = in.readLine()) != null) {
250                     if (datas == "") {
251                         datas = datas + line;
252                     } else {
253                         datas = datas + "\n" + line;
254                     }
255                 }
256                 area.setText(datas);
257                 in.close();
258             } catch (Exception ex) {
259             }
260         }
261     }
262 
263     public void saveText() // 保存
264     {
265         if (name == null) {
266             JFileChooser chooser = new JFileChooser();
267             FileNameExtensionFilter filter = new FileNameExtensionFilter(
268                     "Files", "txt", "java");// 限制扩展名,只能杜渠道txt和java类型的文件
269             chooser.setFileFilter(filter);
270             chooser.setCurrentDirectory(new File("."));//设置当前目录
271             int result = chooser.showSaveDialog(Text4.this);
272             if (result == JFileChooser.APPROVE_OPTION) {//用户按下了yes
273                 name = chooser.getSelectedFile().getPath();
274                 try {
275                     OutputStream out = new FileOutputStream(name);
276                     String datas = area.getText();
277                     out.write(datas.getBytes());
278                     out.close();
279                 } catch (Exception ex) {
280                 }
281             }
282         }
283     }
284 
285     public void anotherSaveText() // 另存为
286     {
287         JFileChooser chooser = new JFileChooser();
288         FileNameExtensionFilter filter = new FileNameExtensionFilter("Files",
289                 "txt", "java","html","js","css");
290         chooser.setFileFilter(filter);
291         chooser.setCurrentDirectory(new File("."));
292         int result = chooser.showSaveDialog(Text4.this);
293         if (result == JFileChooser.APPROVE_OPTION) {//用户按下了yes
294             name = chooser.getSelectedFile().getPath();
295             try {
296                 OutputStream out = new FileOutputStream(name);
297                 String datas = area.getText();
298                 out.write(datas.getBytes());
299                 out.close();
300             } catch (Exception ex) {
301             }
302         }
303     }
304 
305     class HandleAct implements ActionListener {// 内部类
306 
307         public void actionPerformed(ActionEvent e) {
308             // TODO 自动生成的方法存根
309             Font oldF = area.getFont();// 获取当前字体
310             String name = oldF.getName();// 获取当前字体的名字
311             int size = oldF.getSize();// 当前字体的大小
312             if (e.getSource() == size_18)
313                 area.setFont(new Font(name, oldF.getStyle(), 18));
314             else if (e.getSource() == size_19)
315                 area.setFont(new Font(name, oldF.getStyle(), 19));
316             else if (e.getSource() == size_20)
317                 area.setFont(new Font(name, oldF.getStyle(), 20));
318             else if (e.getSource() == size_21)
319                 area.setFont(new Font(name, oldF.getStyle(), 21));
320 
321             if (e.getSource() == red) {
322                 area.setForeground(Color.red);// 设置文字颜色
323             } else if (e.getSource() == blue) {
324                 area.setForeground(Color.blue);// 设置文字颜色
325             }
326 
327             if (e.getSource() == bold) {
328                 area.setFont(new Font(name, Font.BOLD, size));
329             } else if (e.getSource() == italics) {
330                 area.setFont(new Font(name, Font.ITALIC, size));
331             }
332 
333             if (e.getSource() == clear) {
334                 area.setText(" ");
335             } else if (e.getSource() == close) {
336                 System.exit(0);
337             }
338 
339             if (e.getSource() == replice) {
340                 //替换弹出框的布局
341                 JPanel replacePanel = new JPanel();
342                 JLabel lookupLabel = new JLabel("要替换的内容");
343                 JTextField inputText = new JTextField(10);
344                 JLabel replaceLabel = new JLabel("替换为");
345                 JTextField changetoText = new JTextField(10);
346                 replacePanel.add(lookupLabel);
347                 replacePanel.add(inputText);
348                 replacePanel.add(replaceLabel);
349                 replacePanel.add(changetoText);
350                 //布局结束
351                 JOptionPane.showMessageDialog(null, replacePanel);
352                 String text = area.getText();//获得整个文本内容
353                 String changeText = text.replace(inputText.getText(),
354                         changetoText.getText());//启用replace功能函数
355                 area.setText(changeText);
356             }
357             else if (e.getSource() == check) {
358                 //查找弹出框的布局
359                 JPanel swapPanel=new JPanel();
360                 JLabel seekLabel=new JLabel("要查找的内容");
361                 JTextField inputText=new JTextField(20);
362                 swapPanel.add(seekLabel);
363                 swapPanel.add(inputText);
364                 JOptionPane.showMessageDialog(null,swapPanel);
365                 //布局结束
366                 String text=area.getText();//获得整个文本内容
367                 int fromIndex=area.getCaretPosition();//取得当前的光标位置
368                 int lastfromIndex=text.lastIndexOf(inputText.getText(),fromIndex);//获得查找后的位置
369                 area.setCaretPosition(lastfromIndex);
370                 area.moveCaretPosition(lastfromIndex+inputText.getText().length());//使查找到的子字符串显示出来
371             }
372 
373         }
374 
375     }
376 
377 }