1 package editor;
2
3 import java.io.*;
4 import java.awt.*;
5 import java.awt.datatransfer.Clipboard;
6 import java.awt.datatransfer.DataFlavor;
7 import java.awt.datatransfer.StringSelection;
8 import java.awt.datatransfer.Transferable;
9 import java.awt.event.*;
10
11 import javax.swing.JOptionPane;
12
13
14 public class TextMenu {
15
16 public static void main(String[] args) {
17 new MyMenuFrame(); //创建窗口对象
18 }
19 }
20
21 class MyMenuFrame extends Frame{
22 TextArea text;//定义文本域
23 FileDialog fileDlg;
24 String str,fileName;
25 private Clipboard cb;//系统粘贴板
26 String board = null;//复制面板
27 byte byteBuf[] = new byte[10000];
28
29 MenuBar m_MenuBar;//定义菜单条
30 Menu menuFile,menuEdit,sub_Edit_Font,patternEdit,menuHelp,menuSize;//定义菜单项
31 MenuItem mi_File_New,mi_File_Open,mi_File_Save,mi_File_Close,mi_File_Exit;//定义File中的菜单子项
32 MenuItem mi_Edit_Cut,mi_Edit_Copy,mi_Edit_Paste;//定义Edit中的菜单子项
33 MenuItem pattern_Red,pattern_Blue;//定义格式中的菜单子项
34 MenuItem size_18,size_19,size_20,size_21,size_22;//定义字号中的菜单子项
35 MenuItem mi_Help,mi_About;//定义Help中的菜单子项
36
37 CheckboxMenuItem mi_Font_Style,mi_Font_Size;//定义选择式的菜单子项
38
39 PopupMenu popM;//定义弹出式菜单
40 MenuItem pi_Left,pi_Center,pi_Right;//定义弹出菜单中的菜单子项
41
42 Color oldColor;
43 int text_Font_Style,new_Style,text_Font_Size,new_Size;
44 String name;
45 public MyMenuFrame() {
46 // TODO 自动生成的构造函数存根======构造函数
47 super("简易文本编辑器");
48 fileDlg = new FileDialog(this, fileName);
49 text = new TextArea(5,30);
50 text.addMouseListener(new HandleMouse());//响应文本域的鼠标事件===调用内部类
51 add(text,BorderLayout.CENTER);//将文本域加到窗体的*位置=====边界布局
52
53 m_MenuBar = new MenuBar();//创建菜单条
54
55 menuFile = new Menu("文件");
56 mi_File_New = new MenuItem("新建");
57 mi_File_New.setShortcut(new MenuShortcut(KeyEvent.VK_N));//指定快捷键
58 mi_File_Open = new MenuItem("打开");
59 mi_File_Open.setShortcut(new MenuShortcut(KeyEvent.VK_O));//指定快捷键
60 mi_File_Save = new MenuItem("保存");
61 mi_File_Save.setShortcut(new MenuShortcut(KeyEvent.VK_S));//指定快捷键
62 mi_File_Close = new MenuItem("关闭");
63 mi_File_Exit = new MenuItem("退出");
64 //接下来是使菜单项响应动作事件
65 mi_File_New.addActionListener(new HandleAct());
66 mi_File_Open.addActionListener(new HandleAct());
67 mi_File_Save.addActionListener(new HandleAct());
68 mi_File_Close.addActionListener(new HandleAct());
69 mi_File_Exit.addActionListener(new HandleAct());
70 //把菜单子项加入到菜单项
71 menuFile.add(mi_File_New);
72 menuFile.add(mi_File_Open);
73 menuFile.add(mi_File_Save);
74 menuFile.add(mi_File_Close);
75 menuFile.addSeparator();//加一条横向分割线
76 menuFile.add(mi_File_Exit);
77
78
79 menuEdit = new Menu("编辑");
80 mi_Edit_Copy = new MenuItem("复制");
81 mi_Edit_Copy.setShortcut(new MenuShortcut(KeyEvent.VK_C));
82 mi_Edit_Cut = new MenuItem("剪切");
83 mi_Edit_Cut.setShortcut(new MenuShortcut(KeyEvent.VK_X));
84 mi_Edit_Paste = new MenuItem("粘贴");
85 mi_Edit_Paste.setShortcut(new MenuShortcut(KeyEvent.VK_V));
86 sub_Edit_Font = new Menu("字体");
87 mi_Font_Style = new CheckboxMenuItem("粗体");
88 mi_Font_Size = new CheckboxMenuItem("加大");
89 //接下来是使菜单项响应动作事件
90 mi_Edit_Copy.addActionListener(new HandleAct());
91 mi_Edit_Cut.addActionListener(new HandleAct());
92 mi_Edit_Paste.addActionListener(new HandleAct());
93 //选择式菜单命令监听者
94 mi_Font_Style.addItemListener(new HandleItemB());
95 mi_Font_Size.addItemListener(new HandleItemSize());
96 //把菜单子项加入到菜单项
97 sub_Edit_Font.add(mi_Font_Style);
98 sub_Edit_Font.add(mi_Font_Size);
99 menuEdit.add(mi_Edit_Copy);
100 menuEdit.add(mi_Edit_Cut);
101 menuEdit.add(mi_Edit_Paste);
102 menuEdit.addSeparator();//加一条横向分割线
103 menuEdit.add(sub_Edit_Font);
104
105
106 patternEdit =new Menu("格式");
107 pattern_Blue = new MenuItem("蓝色");
108 pattern_Red = new MenuItem("红色");
109 //添加注册事件
110 pattern_Blue.addActionListener(new HandleAct());
111 pattern_Red.addActionListener(new HandleAct());
112 //添加到容器中
113 patternEdit.add(pattern_Blue);
114 patternEdit.add(pattern_Red);
115
116 menuSize = new Menu("字号");
117 size_18 = new MenuItem("18");
118 size_19 = new MenuItem("19");
119 size_20 = new MenuItem("20");
120 size_21 = new MenuItem("21");
121 size_22 = new MenuItem("22");
122 //添加注册事件
123 size_18.addActionListener(new HandleAct());
124 size_19.addActionListener(new HandleAct());
125 size_20.addActionListener(new HandleAct());
126 size_21.addActionListener(new HandleAct());
127 size_22.addActionListener(new HandleAct());
128 //添加到相应的容器
129 menuSize.add(size_18);
130 menuSize.add(size_19);
131 menuSize.add(size_20);
132 menuSize.add(size_21);
133 menuSize.add(size_22);
134
135
136 menuHelp = new Menu("帮助");
137 mi_Help = new MenuItem("帮助");
138 mi_About = new MenuItem("关于");
139 //添加注册事件
140 mi_Help.addActionListener(new HandleAct());
141 mi_About.addActionListener(new HandleAct());
142 //添加到相应的容器
143 menuHelp.add(mi_Help);
144 menuHelp.add(mi_About);
145
146 //添加到菜单栏中
147 m_MenuBar.add(menuFile);//把“文件”加载到菜单条中
148 m_MenuBar.add(menuEdit);//把“编辑”加载到菜单条中
149 m_MenuBar.add(patternEdit);//把“格式”加载到菜单条中
150 m_MenuBar.add(menuSize);
151 m_MenuBar.add(menuHelp);//把“帮助”加载到菜单条中
152
153 this.setMenuBar(m_MenuBar);//把菜单条加载到整个Frame容器中
154
155 //创建弹出式菜单
156 popM = new PopupMenu();
157 //给弹出菜单创建菜单项
158 pi_Left = new MenuItem("左对齐");
159 pi_Right = new MenuItem("右对齐");
160 pi_Center= new MenuItem("居中对齐");
161 //给菜单项添加事件监听
162 pi_Left.addActionListener(new HandleAct());
163 pi_Right.addActionListener(new HandleAct());
164 pi_Center.addActionListener(new HandleAct());
165 //为弹出菜单添加菜单项
166 popM.add(pi_Left);
167 popM.add(pi_Right);
168 popM.add(pi_Center);
169 //将弹出菜单加在文本域上
170 text.add(popM);
171
172 addWindowListener(new HandleClose());//将Frame 注册给窗口事件的监听者
173 setSize(600,400);
174 setVisible(true);
175 name = (text.getFont()).getName();//获取文本域字体
176
177 text_Font_Style = (text.getFont()).getStyle();//获取文本域样式
178 new_Style = text_Font_Style;
179 text_Font_Size = (text.getFont()).getSize();
180 new_Size = text_Font_Size;
181 }//构造函数定义结束
182
183 //事件处理开始
184 class HandleMouse extends MouseAdapter{//内部类(处理文本域中的鼠标事件)
185 @Override
186 public void mouseReleased(MouseEvent e) {//鼠标按键松开事件弹出菜单
187 // TODO 自动生成的方法存根
188 if (e.isPopupTrigger()) {//检测鼠标事件是否由弹出菜单引发
189 popM.show((Component)e.getSource(),e.getX(),e.getY());
190 }//将弹出菜单显示在用户鼠标点击的地方
191 super.mouseReleased(e);
192 }
193 }
194 class HandleAct implements ActionListener{//内部类。处理菜单命令
195
196 public void actionPerformed(ActionEvent e) {
197 // TODO 自动生成的方法存根
198 Font oldF = text.getFont();//获取当前就字体
199 String name = oldF.getName();//保存当前旧字体的字体类型
200 int size = oldF.getSize();//保存当前字体的大小
201 switch (e.getActionCommand()) {
202 // File菜单的事件响应
203 case "新建" :
204 newFile();
205 break;
206 case "打开" :
207 openFile();
208 break;
209 case "保存" :
210 saveFile();
211 break;
212 case "关闭" :
213 closeFile();
214 break;
215 case "退出" :
216 exit();
217 break;
218 // Edit菜单事件响应
219 case "剪切" :
220 cutText();
221 break;
222 case "复制" :
223 copyText();
224 break;
225 case "粘贴" :
226 pasteText();
227 break;
228 //格式菜单响应事件
229 case "蓝色" :
230 turnBlue();
231 break;
232 case "红色" :
233 turnRed();
234 break;
235 //字号菜单响应事件
236 case "18" :
237 //Font对象有三个参数:字体,字型,字号
238 text.setFont(new Font(name,oldF.getStyle(),18));
239 break;
240 case "19" :
241 text.setFont(new Font(name,oldF.getStyle(),19));
242 break;
243 case "20" :
244 text.setFont(new Font(name,oldF.getStyle(),20));
245 break;
246 case "21" :
247 text.setFont(new Font(name,oldF.getStyle(),21));
248 break;
249 case "22" :
250 text.setFont(new Font(name,oldF.getStyle(),22));
251 break;
252 // Help菜单事件响应
253 case "帮助" :
254 help();
255 break;
256 case "关于" :
257 about();
258 break;
259 default :
260 break;
261 }
262
263 }
264 public void newFile() {
265 JOptionPane.showMessageDialog(null, "内容已被更改,是否保存");
266 saveFile();
267 }
268 public void openFile() {
269 fileDlg.show();
270 /*fileDlg = new FileDialog(this,"打开文件",FileDialog.LOAD);
271 fileDlg.setDirectory("");
272 fileDlg.setVisible(true);*/
273 fileName = fileDlg.getFile();
274 /*try {
275 File myfile = new File(fileDlg.getDirectory(),fileDlg.getTitle());
276 RandomAccessFile raf = new RandomAccessFile(myfile, "r");
277 while (raf.getFilePointer()<raf.length()) {
278 text.append(raf.readLine()+"
");//读文件并加载到text中
279 }
280 } catch (IOException e) {
281 // TODO: handle exception
282 System.err.println(e.toString());
283 }*/
284
285 try {
286 FileInputStream in = new FileInputStream(fileName);
287 in.read(byteBuf);
288 in.close();
289 str = new String(byteBuf);
290 text.setText(str);
291 setTitle("TextEditor-" + fileName);
292 } catch (IOException ioe) {
293 }
294 }
295 public void saveFile() {
296 fileDlg.show();
297 fileName = fileDlg.getFile();
298 str = text.getText();
299 byteBuf = str.getBytes();
300 try {
301 FileOutputStream out = new FileOutputStream(fileName);
302 out.write(byteBuf);
303 out.close();
304 } catch (IOException ioe) {
305
306 }
307 }
308 public void closeFile(){
309 text.setText(null);
310 }
311 public void exit() {
312 dispose();
313 System.exit(0);
314 }
315 public void copyText(){//复制
316 board = text.getSelectedText();
317 cb.setContents(new StringSelection(board), null);
318 }
319 public void cutText() {//剪切
320 board = text.getSelectedText();
321 cb.setContents(new StringSelection(board), null);
322 text.replaceRange("", text.getSelectionStart(),
323 text.getSelectionEnd());
324 }
325 public void pasteText() {//粘贴
326 try {
327 Transferable content = cb.getContents(null);
328 String st = (String) content
329 .getTransferData(DataFlavor.stringFlavor);
330 text.replaceRange(st, text.getSelectionStart(),
331 text.getSelectionEnd());
332 } catch (Exception ex) {
333 }
334 }
335 public void turnBlue() {
336
337 }
338 public void turnRed() {
339
340 }
341 public void help() {
342
343 }
344 public void about() {
345
346 }
347 }
348
349 class HandleItemB implements ItemListener{//内部类 (处理"粗体")
350 @Override
351 public void itemStateChanged(ItemEvent e) {//响应选择型菜单项
352 // TODO 自动生成的方法存根
353 Font oldF = text.getFont();//获取当前就字体
354 String name = oldF.getName();//保存当前旧字体的字体类型
355 int size = oldF.getSize();//保存当前字体的大小
356 if (((CheckboxMenuItem)e.getSource()).getState()){//查看是否选中
357 text.setFont(new Font(name,Font.BOLD,size));
358 } else {//未选中
359 new_Style = text_Font_Style;
360 text.setFont(new Font(name,new_Style,new_Size));
361 }
362 }
363 }
364
365 class HandleItemSize implements ItemListener{//内部类 处理大字体
366 @Override
367 public void itemStateChanged(ItemEvent e) {//响应选择型菜单项
368 // TODO 自动生成的方法存根
369 Font oldF = text.getFont();//获取当前就字体
370 String name = oldF.getName();//保存当前旧字体的字体类型
371 int size = oldF.getSize();//保存当前字体的大小
372 if (((CheckboxMenuItem)e.getSource()).getState()){//查看是否选中
373 new_Size = text_Font_Size*2;
374 text.setFont(new Font(name,new_Style,new_Size));
375 } else {
376 new_Size = text_Font_Size;
377 text.setFont(new Font(name,new_Style,new_Size));
378 }
379 }
380 }
381
382 class HandleClose extends WindowAdapter{//内部类 (处理窗口事件)
383 @Override
384 public void windowClosing(WindowEvent e) {
385 // TODO 自动生成的方法存根
386 dispose();
387 System.exit(0);//退出程序
388 super.windowClosing(e);
389 }
390 }
391 }