java记事本 仿windows_仿Windows记事本Swing程序 刺骨的言语ヽ痛彻心扉 2022-11-10 05:23 160阅读 0赞 1.\[代码\]\[Java\]代码 import java.awt.\*; import java.awt.datatransfer.\*; import java.awt.event.\*; import javax.print.\*; import javax.print.attribute.DocAttributeSet; import javax.print.attribute.HashDocAttributeSet; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.MediaSizeName; import javax.swing.\*; import javax.swing.border.BevelBorder; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.filechooser.\*; import javax.swing.filechooser.FileFilter; import javax.swing.plaf.FileChooserUI; import javax.swing.undo.UndoableEdit; import java.io.\*; public class Notepad extends JFrame \{ /\*\* \* @param args \*/ public JTextArea jta=null; //中间的文本区域 private File selectedFile=null; private JFileChooser chooser=null; //文件选择器 private UndoableEdit edit; //设置还原功能 private boolean canUndo=false; private JMenuItem jmiUndoItem; //撤销的菜单 private Clipboard clip=null; //粘贴板 private JDialog jdSearchDialog; public Notepad() \{ super("Notepad Beta"); super.setDefaultCloseOperation(DO\_NOTHING\_ON\_CLOSE); chooser=new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES\_ONLY); clip=Toolkit.getDefaultToolkit().getSystemClipboard(); jta=new JTextArea(); jta.setWrapStyleWord(true); jta.setLineWrap(true); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*右键弹出功能 final JPopupMenu jpMenu=new JPopupMenu(); JMenuItem jpItemUndo=new JMenuItem("撤销(U) "); JMenuItem jpItemCut=new JMenuItem("剪切(T) "); JMenuItem jpItemCopy=new JMenuItem("复制(C) "); JMenuItem jpItemPaste=new JMenuItem("粘贴(P) "); jpMenu.add(jpItemUndo); jpMenu.add(new JPopupMenu.Separator()); jpMenu.add(jpItemCut); jpMenu.add(jpItemCopy); jpMenu.add(jpItemPaste); jpMenu.setBorder(new BevelBorder(BevelBorder.RAISED)); jta.addMouseListener(new MouseAdapter() \{ public void mouseClicked(MouseEvent e) \{ if(e.isMetaDown()) \{ if(!jpMenu.isVisible()) \{ jpMenu.show(e.getComponent(),e.getX(),e.getY()); \} \} else \{ jpMenu.setVisible(false); \} \} \}); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*实现撤销功能 jta.getDocument().addUndoableEditListener(new UndoableEditListener() \{ @Override public void undoableEditHappened(UndoableEditEvent e) \{ // TODO Auto-generated method stub edit=e.getEdit(); if(edit!=null) \{ canUndo=edit.canUndo(); \} else \{ canUndo=false; \} \} \}); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*设置相关菜单和事件监听 Container content=getContentPane(); JMenuBar jmb=new JMenuBar(); JMenu jmFile=new JMenu("文件(F)"); jmFile.setMnemonic('f'); JMenu jmEdit=new JMenu("编辑(E)"); jmEdit.setMnemonic('e'); JMenu jmStyle=new JMenu("格式(O)"); jmStyle.setMnemonic('e'); JMenu jmView=new JMenu("查看(V)"); jmView.setMnemonic('v'); JMenu jmHelp=new JMenu("帮助(H)"); jmHelp.setMnemonic('h'); jmb.add(jmFile); jmb.add(jmEdit); jmb.add(jmStyle); jmb.add(jmView); jmb.add(jmHelp); setJMenuBar(jmb); JMenuItem jmiNewItem=new JMenuItem("新建(N) Ctrl+N"); jmiNewItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub if(!jta.getText().equals("")) \{ int confirm=JOptionPane.showConfirmDialog(Notepad.this, "是否保存(S) Ctrl+S文件?"); if(confirm==JOptionPane.OK\_OPTION) \{ if(selectedFile!=null) \{ try \{ FileWriter fw=new FileWriter(selectedFile); fw.write(jta.getText()); fw.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件写入异常"); \} jta.setText(""); \} else \{ jta.setText(""); JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showSaveDialog(Notepad.this); if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ FileWriter fw=new FileWriter(selectedFile); fw.write(jta.getText()); fw.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件写入异常"); \} \} \} \} else if(confirm==JOptionPane.NO\_OPTION) \{ jta.setText(""); \} else \{\} \} else\{\} \} \}); JMenuItem jmiOpenItem=new JMenuItem("打开(O) Ctrl+O"); jmiOpenItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub if(!jta.getText().equals("")) \{ int confirm=JOptionPane.showConfirmDialog(Notepad.this, "是否保存(S) Ctrl+S文件?"); if(confirm==JOptionPane.OK\_OPTION) \{ if(selectedFile!=null) \{ try \{ FileWriter fw=new FileWriter(selectedFile); fw.write(jta.getText()); fw.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件写入异常"); \} \} else \{ JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showSaveDialog(Notepad.this); if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ FileWriter fw=new FileWriter(selectedFile); fw.write(jta.getText()); fw.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件写入异常"); \} \} \} \} else if(confirm==JOptionPane.NO\_OPTION) \{ jta.setText(""); JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showOpenDialog(Notepad.this); \{ if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ BufferedReader bf=new BufferedReader(new FileReader(selectedFile)); String tempString=""; int i; while((i=bf.read())!=-1) \{ tempString+=String.valueOf((char)i); \} jta.setText(tempString); bf.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件保存(S) Ctrl+S错误"); \} \} else \{\} \} \} else \{\} \} else \{ JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showOpenDialog(Notepad.this); if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ BufferedReader bf=new BufferedReader(new FileReader(selectedFile)); String tempString=""; int i; while((i=bf.read())!=-1) \{ tempString+=String.valueOf((char)i); \} jta.setText(tempString); bf.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件打开(O) Ctrl+O错误"); \} \} else \{\} \} \} \}); JMenuItem jmiSaveItem=new JMenuItem("保存(S) Ctrl+S"); jmiSaveItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub if(jta.getText().equals("")) \{\} else \{ if(selectedFile==null) \{ JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showOpenDialog(Notepad.this); if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ BufferedReader bf=new BufferedReader(new FileReader(selectedFile)); String tempString=""; int i; while((i=bf.read())!=-1) \{ tempString+=String.valueOf((char)i); \} jta.setText(tempString); bf.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件打开(O) Ctrl+O错误"); \} \} else \{\} \} else \{ try \{ FileWriter fw=new FileWriter(selectedFile); fw.write(jta.getText()); fw.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件写入异常"); \} \} \} \}\}); JMenuItem jmiSaveTo = new JMenuItem("另存为(A)..."); jmiSaveTo.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub JFileChooser jChooser=new JFileChooser(); int selection=jChooser.showOpenDialog(Notepad.this); if(selection==JFileChooser.APPROVE\_OPTION) \{ selectedFile=jChooser.getSelectedFile(); try \{ BufferedWriter bf=new BufferedWriter(new FileWriter(selectedFile)); bf.write(jta.getText()); bf.close(); \} catch (Exception e) \{ // TODO: handle exception JOptionPane.showConfirmDialog(Notepad.this, "文件打开(O) Ctrl+O错误"); \} \} else \{\} \} \}); JMenuItem jmiExitItem=new JMenuItem("退出(X)"); jmiExitItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub if(jta.getText().equals("")) System.exit(0); else \{ int t=JOptionPane.showConfirmDialog(Notepad.this, "确定退出(X)?"); if(t==JOptionPane.OK\_OPTION) \{ System.exit(0); \} \} \} \}); JMenuItem jmiPrintItem = new JMenuItem("打印(P) Ctrl+P"); jmiPrintItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub DocFlavor flavor = DocFlavor.INPUT\_STREAM.AUTOSENSE; PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); aset.add(MediaSizeName.ISO\_A4); PrintService\[\] pservices = PrintServiceLookup.lookupPrintServices(flavor, aset); PrintService defaultService=PrintServiceLookup.lookupDefaultPrintService(); if (pservices.length > 0) \{ PrintService service = ServiceUI.printDialog(null, 200, 200, pservices, defaultService, flavor, aset); DocPrintJob pj = service.createPrintJob(); try \{ String fis=jta.getText(); DocAttributeSet das = new HashDocAttributeSet(); Doc doc = new SimpleDoc(fis, flavor, das); pj.print(doc, aset); \} catch (PrintException e) \{ e.printStackTrace(); \} \} \} \}); jmFile.add(jmiNewItem); jmFile.add(jmiOpenItem); jmFile.add(jmiSaveItem); jmFile.add(jmiSaveTo); jmFile.add(new JSeparator()); jmFile.add(jmiPrintItem); jmFile.add(new JSeparator()); jmFile.add(jmiExitItem); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*实现编辑菜单的相关item //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*由于item太多,就放在一个类中实现监听(除了jmiUndoItem) jmiUndoItem = new JMenuItem("撤销(U) Ctrl+Z"); jmiUndoItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub if(canUndo) \{ jmiUndoItem.setEnabled(true); edit.undo(); \} else \{ jmiUndoItem.setEnabled(false); \} \} \}); JMenuItem jmiCutItem = new JMenuItem("剪切(T) Ctrl+T"); jmiCutItem.addActionListener(new EditListener()); JMenuItem jmiCopyItem = new JMenuItem("复制(C) Ctrl+C"); jmiCopyItem.addActionListener(new EditListener()); JMenuItem jmiPasteItem = new JMenuItem("粘贴(P) Ctrl+V"); jmiPasteItem.addActionListener(new EditListener()); JMenuItem jmiDeleteItem = new JMenuItem("删除(L) Del"); jmiDeleteItem.addActionListener(new EditListener()); JMenuItem jmiSearchItem = new JMenuItem("查找(F) Ctrl+F"); jmiSearchItem.addActionListener(new EditListener()); JMenuItem jmiSearchNextItem = new JMenuItem("查找下一个(N) F3"); jmiSearchNextItem.addActionListener(new EditListener()); JMenuItem jmiReplaceItem = new JMenuItem("替换"); jmiReplaceItem.addActionListener(new EditListener()); JMenuItem jmiGoToItem = new JMenuItem("转到"); jmiGoToItem.addActionListener(new EditListener()); JMenuItem jmiSelectAllItem = new JMenuItem("全选"); jmiSelectAllItem.addActionListener(new EditListener()); JMenuItem jmiDateItem = new JMenuItem("日期"); jmiDateItem.addActionListener(new EditListener()); jmEdit.add(jmiUndoItem); jmEdit.add(new JSeparator()); jmEdit.add(jmiCutItem); jmEdit.add(jmiCopyItem); jmEdit.add(jmiPasteItem); jmEdit.add(jmiDeleteItem); jmEdit.add(new JSeparator()); jmEdit.add(jmiSearchItem); jmEdit.add(jmiSearchNextItem); jmEdit.add(jmiReplaceItem); jmEdit.add(jmiGoToItem); jmEdit.add(new JSeparator()); jmEdit.add(jmiSelectAllItem); jmEdit.add(jmiDateItem); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*风格菜单的实现 JCheckBox jcbAutoNextLine=new JCheckBox("自动换行"); JMenuItem jmiFontitemItem = new JMenuItem("字体"); jmStyle.add(jcbAutoNextLine); jmStyle.add(jmiFontitemItem); JMenuItem jmiViewStatusItem = new JMenuItem("查看状态栏"); jmiViewStatusItem.setEnabled(false); jmView.add(jmiViewStatusItem); JMenuItem jmiAboutItem=new JMenuItem("关于"); jmiAboutItem.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent e) \{ // TODO Auto-generated method stub new HelpDialog(Notepad.this); \} \}); //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*帮助菜单 jmHelp.add(jmiAboutItem); setLayout(new BorderLayout()); JScrollPane jsp=new JScrollPane(jta); jsp.requestFocus(true); content.add(jsp,BorderLayout.CENTER); \} public static void main(String\[\] args) throws Exception\{ // TODO Auto-generated method stub try \{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); \} catch (Exception e) \{ System.out.print("Look And Feel Exception"); System.exit(0); // TODO: handle exception \} JFrame frame=new Notepad(); frame.addWindowListener(new WindowAdapter() \{ public void windowClosing(WindowEvent e) \{ int r=JOptionPane.showConfirmDialog(null, "确认退出吗?"); if(r==JOptionPane.OK\_OPTION) System.exit(0); \} \}); frame.setSize(1000,500); frame.setLocationRelativeTo(null); frame.setVisible(true); \} //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*和剪贴板相关函数的实现 public String getClipbordContent(Clipboard clip) throws Exception \{ Transferable trans = clip.getContents(null); if(trans!=null) \{ if(trans.isDataFlavorSupported(DataFlavor.stringFlavor)) return (String)trans.getTransferData(DataFlavor.stringFlavor); else return ""; \} else return ""; \} public void setClipbordContent(Clipboard clip,String str) throws Exception \{ Transferable trans=new StringSelection(str); clip.setContents(trans, null); \} //\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*监听编辑菜单下item的事件 class EditListener implements ActionListener \{ private String tempString=""; String textString=jta.getText(); String searchString=""; int stringLength=0; int startPos; JTextField jtField=null; @Override public void actionPerformed(ActionEvent e) \{ // TODO Auto-generated method stub if(e.getActionCommand().equals("剪切(T) Ctrl+T")) \{ tempString=jta.getSelectedText(); try \{ setClipbordContent(clip, tempString); \} catch (Exception e1) \{ // TODO Auto-generated catch block e1.printStackTrace(); \} jta.replaceSelection(""); \} else if (e.getActionCommand().equals("复制(C) Ctrl+C")) \{ tempString=jta.getSelectedText(); try \{ setClipbordContent(clip, tempString); \} catch (Exception e2) \{ // TODO: handle exception e2.printStackTrace(); \} \} else if (e.getActionCommand().equals("粘贴(P) Ctrl+V")) \{ try \{ tempString=getClipbordContent(clip); \} catch (Exception e1) \{ // TODO Auto-generated catch block e1.printStackTrace(); \} int pos=jta.getCaretPosition(); jta.insert(tempString, pos); \} else if (e.getActionCommand().equals("删除(L) Del")) \{ jta.replaceSelection(""); \} else if (e.getActionCommand().equals("查找(F) Ctrl+F")) \{ jdSearchDialog=new JDialog(Notepad.this,"查找"); Container content=jdSearchDialog.getContentPane(); JLabel jl=new JLabel("查找内容:"); jtField=new JTextField(20); jtField.requestFocus(); JButton jbt1=new JButton("查找"); jbt1.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub searchString=jtField.getText(); stringLength=searchString.length(); if(stringLength>0) \{ startPos=jta.getText().indexOf(searchString); if(startPos>=0) \{ jta.select(startPos, startPos+stringLength); \} else \{ JOptionPane.showConfirmDialog(Notepad.this, "找不到"+"\\""+searchString+"\\""); \} \} else \{ JOptionPane.showConfirmDialog(Notepad.this, "请输入查找内容"); \} \} \}); JPanel jp1=new JPanel(new BorderLayout(3,1)); jp1.add(jl,BorderLayout.WEST); jp1.add(jtField,BorderLayout.CENTER); jp1.add(jbt1,BorderLayout.EAST); JPanel jp3 = new JPanel(new GridLayout(1,2)); jp3.setBorder(BorderFactory.createTitledBorder("方向")); JRadioButton jrb1=new JRadioButton("向上(U)"); JRadioButton jrb2=new JRadioButton("向下(D)"); ButtonGroup bgButtonGroup=new ButtonGroup(); bgButtonGroup.add(jrb1); bgButtonGroup.add(jrb2); jp3.add(jrb1); jp3.add(jrb2); JCheckBox jcb=new JCheckBox("区分大小写(c)"); JPanel jp2 = new JPanel(new BorderLayout()); JButton jbt2=new JButton("取消"); jbt2.addActionListener(new ActionListener() \{ @Override public void actionPerformed(ActionEvent arg0) \{ // TODO Auto-generated method stub jdSearchDialog.dispose(); \} \}); jp2.add(jcb,BorderLayout.WEST); jp2.add(jp3,BorderLayout.CENTER); jp2.add(jbt2,BorderLayout.EAST); content.setLayout(new BorderLayout()); content.add(jp1,BorderLayout.NORTH); content.add(jp2,BorderLayout.CENTER); jdSearchDialog.setDefaultCloseOperation(JDialog.DISPOSE\_ON\_CLOSE); jdSearchDialog.setLocationRelativeTo(null); jdSearchDialog.setSize(400,100); jdSearchDialog.setResizable(false); jdSearchDialog.setVisible(true); \} else if(e.getActionCommand().equals("查找下一个(N) F3")) \{ JOptionPane.showConfirmDialog(Notepad.this, "查找下一个(N) F3 Clicked"); \} else if (e.getActionCommand().equals("替换")) \{ JOptionPane.showConfirmDialog(Notepad.this, "替换 Clicked"); \} else if(e.getActionCommand().equals("转到")) \{ JOptionPane.showConfirmDialog(Notepad.this, "转到"); \} else if (e.getActionCommand().equals("全选")) \{ jta.selectAll(); \} else if (e.getActionCommand().equals("日期")) \{ int pos=jta.getCaretPosition(); java.util.GregorianCalendar calendar=new java.util.GregorianCalendar(); java.util.Date date=calendar.getTime(); tempString=date.toString(); jta.insert(tempString, pos); \} \} \} \}
还没有评论,来说两句吧...