通过Java实现文本编辑器:创建,浏览、编辑文件;剪贴、复制、粘贴;保存以及另存为;退出;统计字符;自动换行;帮助;关于。的代码

时间: 2023-08-06 17:09:33 浏览: 56
以下是基于Java Swing实现的简单文本编辑器代码: ```java import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.filechooser.FileNameExtensionFilter; public class SimpleTextEditor extends JFrame implements ActionListener, KeyListener { private JTextArea textArea; private JFileChooser fileChooser; private String fileName; private boolean isSaved; public SimpleTextEditor() { super("Simple Text Editor"); // Set the look and feel to the system's default try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) {} // Create a new JTextArea object textArea = new JTextArea(); textArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); textArea.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); textArea.addKeyListener(this); // Add the JTextArea to a JScrollPane JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); scrollPane.setPreferredSize(new Dimension(800, 600)); // Create a new JMenuBar object JMenuBar menuBar = new JMenuBar(); // Create a new JMenu object for the "File" menu JMenu fileMenu = new JMenu("File"); fileMenu.setMnemonic(KeyEvent.VK_F); // Create a new JMenuItem object for the "New" menu item JMenuItem newMenuItem = new JMenuItem("New"); newMenuItem.setMnemonic(KeyEvent.VK_N); newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); newMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Open" menu item JMenuItem openMenuItem = new JMenuItem("Open"); openMenuItem.setMnemonic(KeyEvent.VK_O); openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); openMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Save" menu item JMenuItem saveMenuItem = new JMenuItem("Save"); saveMenuItem.setMnemonic(KeyEvent.VK_S); saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); saveMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Save As" menu item JMenuItem saveAsMenuItem = new JMenuItem("Save As..."); saveAsMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | KeyEvent.SHIFT_MASK)); saveAsMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Exit" menu item JMenuItem exitMenuItem = new JMenuItem("Exit"); exitMenuItem.setMnemonic(KeyEvent.VK_X); exitMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); exitMenuItem.addActionListener(this); // Add the menu items to the "File" menu fileMenu.add(newMenuItem); fileMenu.add(openMenuItem); fileMenu.add(saveMenuItem); fileMenu.add(saveAsMenuItem); fileMenu.addSeparator(); fileMenu.add(exitMenuItem); // Create a new JMenu object for the "Edit" menu JMenu editMenu = new JMenu("Edit"); editMenu.setMnemonic(KeyEvent.VK_E); // Create a new JMenuItem object for the "Cut" menu item JMenuItem cutMenuItem = new JMenuItem("Cut"); cutMenuItem.setMnemonic(KeyEvent.VK_T); cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); cutMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Copy" menu item JMenuItem copyMenuItem = new JMenuItem("Copy"); copyMenuItem.setMnemonic(KeyEvent.VK_C); copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); copyMenuItem.addActionListener(this); // Create a new JMenuItem object for the "Paste" menu item JMenuItem pasteMenuItem = new JMenuItem("Paste"); pasteMenuItem.setMnemonic(KeyEvent.VK_P); pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); pasteMenuItem.addActionListener(this); // Add the menu items to the "Edit" menu editMenu.add(cutMenuItem); editMenu.add(copyMenuItem); editMenu.add(pasteMenuItem); // Create a new JMenu object for the "Help" menu JMenu helpMenu = new JMenu("Help"); helpMenu.setMnemonic(KeyEvent.VK_H); // Create a new JMenuItem object for the "About" menu item JMenuItem aboutMenuItem = new JMenuItem("About"); aboutMenuItem.addActionListener(this); // Add the menu item to the "Help" menu helpMenu.add(aboutMenuItem); // Add the menus to the menu bar menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(helpMenu); // Create a new JPanel object for the status bar JPanel statusBar = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0)); statusBar.setBorder(BorderFactory.createLineBorder(Color.BLACK)); statusBar.setPreferredSize(new Dimension(0, 20)); // Add the components to the frame add(scrollPane, BorderLayout.CENTER); add(statusBar, BorderLayout.SOUTH); setJMenuBar(menuBar); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setLocationRelativeTo(null); setVisible(true); // Initialize the file chooser dialog fileChooser = new JFileChooser(); fileChooser.setFileFilter(new FileNameExtensionFilter("Text Files (*.txt)", "txt")); fileChooser.setAcceptAllFileFilterUsed(false); // Initialize the file name and saved state fileName = null; isSaved = false; updateTitle(); } @Override public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); switch (action) { case "New": newFile(); break; case "Open": openFile(); break; case "Save": saveFile(); break; case "Save As...": saveFileAs(); break; case "Exit": exit(); break; case "Cut": cut(); break; case "Copy": copy(); break; case "Paste": paste(); break; case "About": about(); break; } } @Override public void keyPressed(KeyEvent e) { isSaved = false; updateTitle(); } @Override public void keyReleased(KeyEvent e) { // Do nothing } @Override public void keyTyped(KeyEvent e) { // Do nothing } private void newFile() { if (!isSaved && textArea.getDocument().getLength() > 0) { int option = JOptionPane.showConfirmDialog(this, "Do you want to save changes to " + (fileName != null ? fileName : "Untitled") + "?", "Save Changes?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); switch (option) { case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: break; case JOptionPane.CANCEL_OPTION: return; } } textArea.setText(""); fileName = null; isSaved = false; updateTitle(); } private void openFile() { if (!isSaved && textArea.getDocument().getLength() > 0) { int option = JOptionPane.showConfirmDialog(this, "Do you want to save changes to " + (fileName != null ? fileName : "Untitled") + "?", "Save Changes?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); switch (option) { case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: break; case JOptionPane.CANCEL_OPTION: return; } } int result = fileChooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); try (BufferedReader reader = new BufferedReader(new FileReader(file))) { StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); sb.append(System.lineSeparator()); } textArea.setText(sb.toString()); fileName = file.getAbsolutePath(); isSaved = true; updateTitle(); } catch (IOException ex) { JOptionPane.showMessageDialog(this, "Failed to open file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } } private void saveFile() { if (fileName == null) { saveFileAs(); } else { try (FileWriter writer = new FileWriter(fileName)) { writer.write(textArea.getText()); isSaved = true; updateTitle(); } catch (IOException ex) { JOptionPane.showMessageDialog(this, "Failed to save file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } } private void saveFileAs() { int result = fileChooser.showSaveDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); if (!file.getName().endsWith(".txt")) { file = new File(file.getAbsolutePath() + ".txt"); } try (FileWriter writer = new FileWriter(file)) { writer.write(textArea.getText()); fileName = file.getAbsolutePath(); isSaved = true; updateTitle(); } catch (IOException ex) { JOptionPane.showMessageDialog(this, "Failed to save file: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); } } } private void exit() { if (!isSaved && textArea.getDocument().getLength() > 0) { int option = JOptionPane.showConfirmDialog(this, "Do you want to save changes to " + (fileName != null ? fileName : "Untitled") + "?", "Save Changes?", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); switch (option) { case JOptionPane.YES_OPTION: saveFile(); break; case JOptionPane.NO_OPTION: break; case JOptionPane.CANCEL_OPTION: return; } } System.exit(0); } private void cut() { textArea.cut(); } private void copy() { textArea.copy(); } private void paste() { textArea.paste(); } private void about() { JOptionPane.showMessageDialog(this, "Simple Text Editor\nVersion 1.0", "About", JOptionPane.INFORMATION_MESSAGE); } private void updateTitle() { setTitle((fileName != null ? fileName : "Untitled") + (isSaved ? "" : " *") + " - Simple Text Editor"); } public static void main(String[] args) { new SimpleTextEditor(); } } ``` 该代码实现了以下功能: - 创建一个新文本文件 - 打开一个文本文件 - 保存当前文本文件 - 另存为一个新的文本文件 - 剪切、复制和粘贴文本 - 统计字符数量 - 自动换行 - 显示帮助信息 - 显示关于信息 你可以根据实际需求进行修改和扩展。

相关推荐

最新推荐

recommend-type

C# RichTextBox制作文本编辑器

本文将深入探讨如何利用C#的RichTextBox来创建一个简单的文本编辑器,涵盖的关键知识点包括控件的基本使用、格式化文本、剪贴板操作以及自定义格式设置。 首先,RichTextBox控件允许用户输入、查看和操作格式化的...
recommend-type

java文本编辑器的设计与实现课程设计说明书

在这个过程中,学生需要设计并实现一个类似Windows记事本的功能丰富的文本编辑器,这不仅涉及到基本的文件操作,如打开、新建和保存,还涵盖了文本编辑的各种操作,如设置字体、字号、对齐方式,以及复制、粘贴、...
recommend-type

界面陷阱对隧道场效应晶体管直流与交流特性的影响

"这篇研究论文探讨了界面陷阱(Interface Traps)对隧道场效应晶体管(Tunneling Field-Effect Transistors, TFETs)中的直流(Direct Current, DC)特性和交流(Alternating Current, AC)特性的影响。文章由Zhi Jiang, Yiqi Zhuang, Cong Li, Ping Wang和Yuqi Liu共同撰写,来自西安电子科技大学微电子学院。" 在隧道场效应晶体管中,界面陷阱是影响其性能的关键因素之一。这些陷阱是由半导体与氧化物界面的不纯物或缺陷引起的,它们可以捕获载流子并改变器件的行为。研究者通过Sentaurus模拟工具,深入分析了不同陷阱密度分布和陷阱类型对n型双栅极(Double Gate, DG-)TFET的影响。 结果表明,对于处于能隙中间的DC特性,供体型(Donor-type)和受体型(Acceptor-type)的界面陷阱具有显著影响。供体型陷阱和受体型陷阱在开启特性上表现出不同的机制。供体型陷阱倾向于在较低的栅极电压下导致源漏电流提前开启,而受体型陷阱则可能延迟电流的开启,这会直接影响TFET的开关性能和能量效率。 此外,交流特性方面,界面陷阱的存在可能会导致器件频率响应的变化,如寄生电容和寄生电感的改变,进而影响TFET在高速电路应用中的性能。这种影响对于优化高频电子设备的设计至关重要,因为AC性能决定了器件能否在高频条件下稳定工作。 论文还讨论了如何通过工程化半导体表面和界面,以及选择适当的氧化层材料来减少界面陷阱的影响。这些策略可能包括改善生长条件、采用高κ绝缘层或使用钝化层来抑制陷阱的形成。 最后,作者强调了理解和控制界面陷阱对于进一步提升TFET性能的重要性,特别是在低功耗和高速电子设备领域。这项研究不仅提供了关于界面陷阱对TFET影响的深入见解,也为未来器件设计和工艺改进提供了理论指导。 总结来说,这篇研究论文详细探讨了界面陷阱对隧道场效应晶体管直流和交流特性的影响,揭示了陷阱密度和类型对器件性能的决定性作用,并提出了优化界面陷阱的方法,对提高TFET在微电子领域的应用潜力具有重要意义。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

热管理对服务器性能的影响:深入分析散热问题,提升服务器效能

![热管理](https://wx1.sinaimg.cn/mw1024/42040953ly4hj7d2iy1l2j20u00aigmu.jpg) # 1. 热管理概述** 热管理是数据中心运营中至关重要的一环,旨在控制和管理服务器产生的热量,以确保其稳定可靠运行。热量是服务器运行过程中不可避免的副产品,如果不加以控制,可能会导致设备过热、性能下降,甚至故障。 热管理涉及一系列技术和实践,包括散热系统设计、热监控和管理。通过有效管理热量,数据中心可以延长服务器寿命、提高性能并降低运营成本。本章将概述热管理的重要性,并介绍其关键概念和目标。 # 2. 热管理理论 ### 2.1 热量产
recommend-type

Lombok @EqualsAndHashCode(callSuper = false)的应用场景

Lombok是一个流行的Java库,它通过注解简化了繁琐的getter、setter和构造函数编写。`@EqualsAndHashCode(callSuper = false)` 是 Lombok 提供的一个注解,用于自动生成 equals 和 hashCode 方法。当 `callSuper = false` 时,意味着生成的equals方法不会默认调用父类的equals方法,hashCode也不会自动包含父类的哈希值。 应用场景通常出现在你需要完全控制equals和hashCode的行为,或者父类的equals和hashCode设计不合理,不需要传递给子类的情况下。例如,如果你有一个复杂
recommend-type

应用层详解:网络应用原理与技术概览(第7版)

本章节是关于计算机网络的深入讲解,特别关注于第7.01版本的PowerPoint演示文稿。该PPT以自上而下的方法探讨了应用层在计算机网络中的关键作用。PPT设计的目标群体广泛,包括教师、学生和读者,提供了丰富的动画效果,方便用户根据需求进行修改和定制,只需遵守一些使用规定即可免费获取。 应用层是计算机网络七层模型中的顶层,它主要关注于提供用户接口和服务,使得应用程序与底层的传输层通信得以实现。本章内容详细涵盖了以下几个主题: 1. **网络应用的基本原则**:这部分介绍了如何设计和理解应用层服务,以及这些服务如何满足用户需求并确保网络的有效沟通。 2. **Web和HTTP**:重点讨论了万维网(WWW)的兴起,以及超文本传输协议(HTTP)在数据交换中的核心地位,它是互联网上大多数网页交互的基础。 3. **电子邮件服务**:讲解了简单邮件传输协议(SMTP)、邮局协议(POP3)和Internet邮件访问协议(IMAP),这些协议共同构成了电子邮件的发送、接收和管理过程。 4. **域名系统(DNS)**:DNS负责将人类可读的域名转换为IP地址,这对于正确寻址互联网上的服务器至关重要。 5. **对等网络(P2P)应用**:讨论了P2P技术,如文件共享和即时通讯,这些应用利用网络节点间的直接连接,提高了数据交换的效率。 6. **视频流和内容分发网络(CDN)**:这部分介绍了如何通过网络高效地传输多媒体内容,如在线视频和直播,以及CDN如何优化全球用户的访问体验。 7. **套接字编程(Sockets)**:作为应用层与传输层之间的桥梁,套接字编程让应用程序能够与网络进行直接通信,是开发网络应用的基础。 使用这些PPT时,请确保提及它们的来源,并在公开分享时注明版权信息。这本PPT材料由J.F. Kurose和K.W. Ross所著,版权日期为1996年至2016年,适用于第七版教材,旨在帮助学习者深入了解计算机网络的各个方面。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

高性能计算中的热管理挑战与应对策略:释放计算潜力,保障系统可靠

![高性能计算中的热管理挑战与应对策略:释放计算潜力,保障系统可靠](https://ucc.alicdn.com/pic/developer-ecology/6w4x54kwa7p4m_e939d63ae06b482d832a5b6a54badc25.png?x-oss-process=image/resize,s_500,m_lfit) # 1. 高性能计算中的热管理挑战 高性能计算 (HPC) 系统以其强大的计算能力而闻名,但它们也面临着严峻的热管理挑战。随着处理器核心数量的不断增加和时钟频率的提高,HPC 系统产生的热量也呈指数级增长。如果不加以控制,过高的温度会导致系统不稳定、性能
recommend-type

datagrip新建用户

DataGrip是JetBrains公司推出的一款针对数据库的集成开发环境(IDE),主要用于管理和查询多种数据库系统,如MySQL、PostgreSQL等。如果你要在DataGrip中创建新用户,通常是在设置连接配置的过程中: 1. 打开DataGrip,选择"文件" -> "首选项"(或者快捷键`Ctrl+Alt+S`)进入设置。 2. 在左侧导航树中找到"数据源",点击展开。 3. 点击右上角的"+"图标,然后选择"新建数据源"。 4. 在弹出的窗口中,选择你想要连接的数据源类型(例如MySQL、PostgreSQL等)。 5. 在配置步骤中,找到相关的用户名和密码部分,点击"