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 }