本文实例为大家分享了Java仿Windows记事本的具体代码,供大家参考,具体内容如下
先上截图:
源代码:
import java.awt.*; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.undo.UndoManager; import java.awt.event.*; import java.io.*; /** * * @author cjbi@outlook.com * @created 2015年7月6日 上午11:22:24 */ public class JNotepad extends JFrame implements ActionListener { JMenuBar menubar = new JMenuBar(); JMenu file = new JMenu("文件(F)"); JMenu edit = new JMenu("编辑(E)"); JMenu format = new JMenu("格式(O)"); JMenu help = new JMenu("帮助(H)"); JMenuItem create = new JMenuItem("新建"); JMenuItem open = new JMenuItem("打开..."); JMenuItem save = new JMenuItem("保存"); JMenuItem saveAs = new JMenuItem("另存为..."); JMenuItem exit = new JMenuItem("退出"); JMenuItem undo = new JMenuItem("撤销"); JMenuItem cut = new JMenuItem("剪切"); JMenuItem copy = new JMenuItem("复制"); JMenuItem paste = new JMenuItem("粘贴"); JMenuItem findRep = new JMenuItem("查找替换"); JMenuItem selectAll = new JMenuItem("全选"); JMenuItem font = new JMenuItem("字体"); JMenuItem about = new JMenuItem("关于"); JMenuItem cut2 = new JMenuItem("剪切(X)"); JMenuItem copy2 = new JMenuItem("复制(C)"); JMenuItem paste2 = new JMenuItem("粘贴(V)"); JMenuItem selectAll2 = new JMenuItem("全选(A)"); public static JTextArea textarea = new JTextArea(); UndoManager um = new UndoManager(); JScrollPane scroll = new JScrollPane(textarea, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); JPopupMenu popup = new JPopupMenu(); String pathSelect; // 获取屏幕尺寸 Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); public JNotepad() { // 此处定义键盘快捷键 // MenuBar file.setMnemonic(KeyEvent.VK_F); edit.setMnemonic(KeyEvent.VK_E); format.setMnemonic(KeyEvent.VK_O); help.setMnemonic(KeyEvent.VK_H); // MenuItem create.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK)); open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK)); save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK)); undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK)); cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.CTRL_MASK)); copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK)); paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK)); findRep.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.CTRL_MASK)); selectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK)); // 事件监听者 save.addActionListener(this); create.addActionListener(this); open.addActionListener(this); saveAs.addActionListener(this); exit.addActionListener(this); undo.addActionListener(this); cut.addActionListener(this); copy.addActionListener(this); paste.addActionListener(this); selectAll.addActionListener(this); font.addActionListener(this); about.addActionListener(this); cut2.addActionListener(this); copy2.addActionListener(this); paste2.addActionListener(this); selectAll2.addActionListener(this); findRep.addActionListener(this); // 设置撤销文本的管理器 textarea.getDocument().addUndoableEditListener(um); textarea.setFont(Format.font); // 文件 file.add(create); file.add(open); file.add(save); file.add(saveAs); file.addSeparator(); file.add(exit); // 编辑 edit.add(undo); edit.addSeparator(); edit.add(cut); edit.add(copy); edit.add(paste); edit.addSeparator(); edit.add(findRep); edit.addSeparator(); edit.add(selectAll); // 格式 format.add(font); // 帮助 help.add(about); // 菜单栏 menubar.add(file); menubar.add(edit); menubar.add(format); menubar.add(help); // 右键菜单 popup.add(cut2); popup.add(copy2); popup.add(paste2); popup.addSeparator(); popup.add(selectAll2); // 添加到文本域容器 textarea.add(popup); // 匿名内部类监听器右键动作 textarea.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON3) { popup.show(textarea, e.getX(), e.getY()); } } }); // 边界布局 this.add(menubar, BorderLayout.NORTH); this.add(scroll, BorderLayout.CENTER); this.setTitle("记事本"); this.setSize(500, 400); this.setLocationRelativeTo(null); this.setIconImage(new ImageIcon(this.getClass().getResource("/icon/notepad.png")).getImage());//图标放在源目录的icon文件夹 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true); } // 重写actionPerformed @Override public void actionPerformed(ActionEvent e) { // Event对象发生源 if (e.getSource() == open) { JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文档(*.txt)", "txt"); chooser.setFileFilter(filter); chooser.setDialogTitle("文件打开"); chooser.showOpenDialog(null); chooser.setVisible(true); try { pathSelect = chooser.getSelectedFile().getPath(); FileReader wjl = new FileReader(pathSelect); BufferedReader hcl = new BufferedReader(wjl); String s = "", zfc = ""; while ((s = hcl.readLine()) != null) { zfc += (s + "\n"); } textarea.setText(zfc); } catch (Exception e1) { } } if (e.getSource() == saveAs) {// 另存为 JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("文本文档(*.txt)", "txt"); chooser.setFileFilter(filter); chooser.setDialogTitle("另存为"); chooser.showSaveDialog(null); chooser.setVisible(true); PrintStream ps; try { String select = chooser.getSelectedFile().getPath(); ps = new PrintStream(select); System.setOut(ps); System.out.println(this.textarea.getText()); } catch (Exception e1) { } } if (e.getSource() == save && (pathSelect == null)) {// 保存 JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("保存"); chooser.showSaveDialog(null); chooser.setVisible(true); PrintStream ps; try { pathSelect = chooser.getSelectedFile().getPath(); ps = new PrintStream(pathSelect); System.setOut(ps); System.out.println(this.textarea.getText()); } catch (Exception e1) { } } else if (e.getSource() == save && !(pathSelect == null)) { PrintStream ps; try { ps = new PrintStream(pathSelect); System.setOut(ps); System.out.println(this.textarea.getText()); } catch (FileNotFoundException e1) { } } if (e.getSource() == create) { textarea.setText(""); pathSelect = null; } if (e.getSource() == exit) { System.exit(0); } if (e.getSource() == undo) { if (um.canUndo()) { um.undo(); } } if (e.getSource() == cut || e.getSource() == cut2) { textarea.cut(); } else if (e.getSource() == copy || e.getSource() == copy2) { textarea.copy(); } else if (e.getSource() == paste || e.getSource() == paste2) { textarea.paste(); } else if (e.getSource() == findRep) { new FindAndReplace(textarea); } else if (e.getSource() == selectAll || e.getSource() == selectAll2) { textarea.selectAll(); } if (e.getSource() == font) { new Format(textarea); } if (e.getSource() == about) { new About(); } } public static void main(String[] args) { new JNotepad(); } } class FindAndReplace extends JDialog implements ActionListener {// 查找和替换 JLabel findLabel = new JLabel("查找内容:"); JLabel repLabel = new JLabel(" 替换为:"); JTextField findTf = new JTextField(8); JTextField repTf = new JTextField(8); JButton findBtn = new JButton("查找"); JButton repBtn = new JButton("替换"); JPanel findPn = new JPanel(); JPanel repPn = new JPanel(); JTextArea textarea; String text; boolean flg = false; int len; int start = 0; int k = 0; public FindAndReplace(JTextArea textarea) { this.textarea = textarea; findPn.add(findLabel); findPn.add(findTf); findPn.add(findBtn); repPn.add(repLabel); repPn.add(repTf); repPn.add(repBtn); this.add(findPn); this.add(repPn); findBtn.addActionListener(this); repBtn.addActionListener(this); this.setTitle("查找和替换"); this.setLayout(new GridLayout(2, 1)); // this.setBounds(400, 200, 300, 140); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); } @SuppressWarnings("deprecation") public void actionPerformed(ActionEvent e) { String findText = findTf.getText(); String repText = repTf.getText(); text = textarea.getText(); if (e.getSource() == findBtn) { findBtn.setLabel("下一个"); if (findText != null) { len = findText.length(); start = text.indexOf(findText, k); k = start + len; textarea.select(start, start + len); flg = true; if (start == -1) { JOptionPane.showMessageDialog(null, "已到文件尾部!", "提示", JOptionPane.INFORMATION_MESSAGE); start = 0; k = 0; flg = false; } } } else if (e.getSource() == repBtn) { if (flg) { textarea.replaceRange(repText, start, start + len); flg = false; } } } } // 字体格式 class Format extends JDialog implements ActionListener { public static int style = 0; // 全局变量类型,默认值为0 public static int size = 16; // 全局变量字体大小,默认值为16 public static Font font = new Font("新宋体", style, size); // 全局变量字体,默认值为新宋体 JPanel pn = new JPanel(); JPanel okCelPn = new JPanel(); JPanel fontPn = new JPanel(); JPanel ptPn = new JPanel(); JLabel fontLabel = new JLabel("字体: "); JLabel fontStyleLabel = new JLabel(" 字形: "); JLabel ptLabel = new JLabel(" 磅值: "); JButton ok = new JButton("确定"); JButton cancel = new JButton("取消"); GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();// 获取系统中可用的字体的名字 String[] fontName = e.getAvailableFontFamilyNames();// 获取系统中可用的字体的名字 String[] fontType = { "常规", "倾斜", "粗体", "粗偏斜体" }; JList fontList = new JList(fontName); JList fontTypeList = new JList(fontType); JScrollPane fontScroll = new JScrollPane(fontList); JScrollPane fontTypeScroll = new JScrollPane(fontTypeList); JTextArea textarea; SpinnerModel spinnerModel = new SpinnerNumberModel(size, // initial value 0, // min 100, // max 2 // Step ); JSpinner spinner = new JSpinner(spinnerModel); public Format(JTextArea textarea) { this.textarea = textarea; ok.addActionListener(this); cancel.addActionListener(this); pn.setLayout(new GridLayout(2, 1)); pn.add(fontPn); pn.add(ptPn); fontPn.add(fontLabel); fontPn.add(fontScroll); fontPn.add(fontStyleLabel); fontPn.add(fontTypeScroll); ptPn.add(ptLabel); ptPn.add(spinner); fontList.setVisibleRowCount(5); fontList.setFixedCellWidth(60); fontList.setSelectedIndex(50); fontList.setSelectedValue(font.getFontName(), true); fontTypeList.setVisibleRowCount(5); fontTypeList.setSelectedIndex(style); okCelPn.add(ok); okCelPn.add(cancel); okCelPn.setLayout(new FlowLayout(FlowLayout.RIGHT)); this.add(pn, BorderLayout.CENTER); this.add(okCelPn, BorderLayout.SOUTH); this.setTitle("字体"); this.pack(); this.setLocationRelativeTo(null); this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } public void actionPerformed(ActionEvent e) { if (e.getSource() == ok) { System.out.println(fontList.getSelectedValue()); style = this.type(); size = Integer.parseInt(spinner.getValue().toString()); font = new Font((String) fontList.getSelectedValue(), style, size); textarea.setFont(font); this.dispose(); System.out.println(type()); } else if (e.getSource() == cancel) { this.dispose(); } } private int type() { if (fontTypeList.getSelectedValue().equals("倾斜")) { return 1; } else if (fontTypeList.getSelectedValue().equals("粗体")) { return 2; } else if (fontTypeList.getSelectedValue().equals("粗偏斜体")) { return 3; } else return 0; } } class About extends JDialog {// 关于窗口 About() { JOptionPane.showMessageDialog(null, " 作者:cjb 版本:v1.5\n\n 联系:cjbi@outlook.com", "关于", JOptionPane.PLAIN_MESSAGE); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍java仿windows记事本功能完整版,包括了java仿windows记事本功能完整版的使用技巧和注意事项,需要的朋友参考一下 最近学了Java编程,就编了仿windows系统下的记事本练练手,这个记事本实现了windows系统下的大部分功能,只有很少的部分没有实现,比如撤销命令的不完美,这是本人的能力有限,还有那些JMenuItem的是否可用问题,这只是本人比较偷懒,无心再去实现
问题内容: 在哪里可以下载Java本机方法源代码?例如,我想知道的源代码,但找不到。 问题答案: 您可以在此处下载OpenJdk源代码。 在该文件夹中,您可以获取源代码。 是使用c和c ++编写的natice方法。 Linux的源代码。 Windows的源。 索拉里斯的来源。 共同来源。 例如:System.arrayCopy(); int文件行168:
问题内容: 是否有任何的方式来查看Java中的默认类背后的实际代码(,,等),看看 究竟 它是什么,是怎么回事? 我不仅指文档或方法列表等,还包括源代码本身的详细信息(换句话说,如果将其复制并粘贴到整个方法/类中,则可以用来创建整个方法/类的精确副本) Java程序的代码)。 问题答案: JDK安装程序在名为的文件中提供了所有API类的Java源代码。它通常只是坐在您的安装目录中。解压缩,看看。
你好,我已经创建了这个枚举一段时间了。枚举正在分叉代码中使用,这意味着另一个项目在每次导出时都有这个精确的代码。 然而,最近,在导出整个项目之后,方法“Angle()”抛出了一个nosuchMethodError:...Angle()F 首先,方法末尾的F是什么意思?其次,一个100%更新的代码怎么可能会抛出这个错误呢? 编辑:我确实找到了问题的起因...或多或少。另一个.jar(插件)也使用了受
问题内容: 我需要检查的代码,以查看它在Linux上到底如何子进程。 有谁知道该方法的作用或链接到其来源?我检查了源代码,它只是一个抽象类,并且该方法尚未实现,似乎没有链接到或的任何子类 。任何帮助将不胜感激。 谢谢, 问题答案: 进程管理和所有类似操作均由OS完成。因此,JVM必须调用适当的系统调用才能破坏进程。显然,这将在操作系统之间有所不同。 在Linux上,我们可以通过syscall来执行
我认为两个线程同时调用take方法,只有一个线程可以成功地获得锁,而另一个线程将在以下行等待锁:这是take的源代码: 但是,当我对这两个线程进行线程转储时,我发现两个线程都成功锁定,并且在线等待:(因为队列为空)这是线程转储: “test-thread-18”#6357守护进程prio=5 os_prio=0 tid=0x00007f8f54543000 nid=0x58ef在条件[0x0000