(JAVA)利用GUI编写简单文本编辑器

article/2025/11/9 10:47:45

今天我们来尝试写一段代码,编写一个简单的文本编辑器,一起来看看吧!

首先我们需要用到Java中的继承(extends)接口(implements)。我们将其分为两个文件:一个文件中是所有的布局和逻辑;另一个文件中是GUI中最基本的框架(JFrame)

布局方面,我选择了方便却需要较多设置的空布局(NullLayout)

用到的组件有:标签(JLabel)、滑块(JSlider)、单行文本框(JTextField)、多行文本框(JTextArea)、按钮(JButton)、按钮组(JButtonGroup)、单选按钮(JRadioButton)、字体(Font)和提示框(JDialog)

用到的事件监听器有: ItemListener 、ChangeListener  和  ActionListener

接下来,我们一起看看代码吧!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;public class NullLayout extends JFrame implements ItemListener, ChangeListener, ActionListener{/*** 设置serialVersionUID属性,防止编译器警告序列化NullLayout没有声明serialVersionUID*/private static final long serialVersionUID = 1L;/*** @param 这部分为成员变量设置*/private JLabel Topjlabel = new JLabel("字体大小");private JLabel Bottomjlabel = new JLabel("字体颜色");private JLabel Bottomjlabel2 = new JLabel("滑动标签");//↓↓↓↓↓↓↓↓这两行顺序不可改变,slider对象应在初始化后调用private JSlider slider = new JSlider();			//Slider默认最小值0,最大值100,初始值50private JLabel Bottomcenterjlabel = new JLabel("滑块的值是"+slider.getValue());//↑↑↑↑↑↑↑↑这两行顺序不可改变,slider对象应在初始化后调用private JLabel transformtoRGB = new JLabel("十六进制:");private JLabel useRGB_R = new JLabel("R");private JLabel useRGB_G = new JLabel("G");private JLabel useRGB_B = new JLabel("B");private JLabel prompt = new JLabel("      请输入7位16进制色彩代码");private JLabel prompt2 = new JLabel("请输入正确的sRGB色彩(要求RGB在0~255)");private JTextField R = new JTextField("255",3);private JTextField G = new JTextField("255",3);private JTextField B = new JTextField("255",3);private JTextField jtextfield = new JTextField("#000000",7);private JButton RGBbutton = new JButton("转换");private JButton jbtn = new JButton("转换");private ButtonGroup btngroup = new ButtonGroup();private ButtonGroup btngroup2 = new ButtonGroup();private JRadioButton rbt1 = new JRadioButton("小号");private JRadioButton rbt2 = new JRadioButton("中号");private JRadioButton rbt3 = new JRadioButton("大号");private JRadioButton rbt4 = new JRadioButton("红色");private JRadioButton rbt5 = new JRadioButton("黄色");private JRadioButton rbt6 = new JRadioButton("蓝色");private JTextArea textarea = new JTextArea("在此输入文本...",20,20);private Font f1 = new Font("仿宋",Font.BOLD,25);private Font f2 = new Font("仿宋",Font.PLAIN,25);private JDialog jdialog = new JDialog(this,"提示",true);private JDialog jdialog2 = new JDialog(this,"提示",true);/*** @param 成员变量设置完毕*///构造器public NullLayout(String title){super(title);		//调用父类一参构造器,并初始化JFrame的标题为"简单文本编辑器"。init();		//为防止构造器内容过多,调用外部函数}//构造器内部分,为防止构造器内代码过长,通过调用函数实现public void init(){//设置布局为空布局setLayout(null);//设置窗口大小不可改变setResizable(false);//将字体大小文本加入JPaneladd(Topjlabel);//设置字体大小组件位置Topjlabel.setBounds(100, 20, 200, 50);//设置字体大小组件字体样式Topjlabel.setFont(f1);//将字体大小单选按钮加入按钮组btngroup.add(rbt1);btngroup.add(rbt2);btngroup.add(rbt3);//将字体大小按钮加入JPaneladd(rbt1);add(rbt2);add(rbt3);//设置字体大小按钮的位置rbt1.setBounds(400, 20, 200, 50);rbt2.setBounds(600, 20, 200, 50);rbt3.setBounds(800, 20, 200, 50);//设置字体大小单选按钮的字体rbt1.setFont(f1);rbt2.setFont(f1);rbt3.setFont(f1);//将字体大小按钮加入ItemListener监听器rbt1.addItemListener(this);rbt2.addItemListener(this);rbt3.addItemListener(this);//将多行文本区域加入JPaneladd(textarea);//设置多行文本区域起始位置textarea.setBounds(0, 90, 1000, 400);//设置多行文本区域内的字体textarea.setFont(f2);//添加字体颜色组件到JPaneladd(Bottomjlabel);//设置字体颜色组件位置Bottomjlabel.setBounds(100, 510, 200, 50);//设置字体颜色组件的字体Bottomjlabel.setFont(f1);//将字体颜色单选按钮加入按钮组btngroup2.add(rbt4);btngroup2.add(rbt5);btngroup2.add(rbt6);//将字体颜色单选按钮加入JPaneladd(rbt4);add(rbt5);add(rbt6);//设置字体颜色按钮的位置rbt4.setBounds(400, 510, 200, 50);rbt5.setBounds(600, 510, 200, 50);rbt6.setBounds(800, 510, 200, 50);//设置字体颜色按钮组的字体rbt4.setFont(f1);rbt5.setFont(f1);rbt6.setFont(f1);//将字体颜色按钮加入ItemListener监听器rbt4.addItemListener(this);rbt5.addItemListener(this);rbt6.addItemListener(this);//将滑动标签文本加入JPaneladd(Bottomjlabel2);//设置滑动标签文本位置Bottomjlabel2.setBounds(100, 580, 150, 50);//设置滑动标签文本的字体Bottomjlabel2.setFont(f1);//将‘滑块的值是’文本加入JPaneladd(Bottomcenterjlabel);//设置‘滑块的值是’文本位置Bottomcenterjlabel.setBounds(300, 580, 200, 50);//设置‘滑块的值是’文本的字体Bottomcenterjlabel.setFont(f1);//将滑块加入JPaneladd(slider);//设置滑块位置slider.setBounds(550, 580, 300, 50);//设置滑块主要刻度间距slider.setMajorTickSpacing(10);//设置滑块次要刻度间距slider.setMinorTickSpacing(5);//绘制滑块标签slider.setPaintLabels(true);//绘制滑块刻度标记slider.setPaintTicks(true);//绘制滑块滑道slider.setPaintTrack(true);//将滑块加入ChangeListener监听器slider.addChangeListener(this);//将‘十六进制’文本加入JPaneladd(transformtoRGB);//设置‘十六进制’文本位置transformtoRGB.setBounds(100, 650, 150, 50);//设置‘十六进制’文本字体transformtoRGB.setFont(f1);//将十六进制单行文本框加入JPaneladd(jtextfield);//设置十六进制单行文本框位置jtextfield.setBounds(250, 650, 120, 50);//设置十六进制单行文本框字体jtextfield.setFont(f1);//将转换按钮加入JPaneladd(jbtn);//设置转换按钮位置jbtn.setBounds(400, 650, 100, 50);//设置转换按钮字体jbtn.setFont(f1);//设置转换按钮的事件监听为ActionListenerjbtn.addActionListener(this);/**将‘R,G,B’加入JPanel* 设置‘R,G,B’位置* 设置‘R,G,B'字体*/add(useRGB_R);useRGB_R.setBounds(105, 720, 20, 50);useRGB_R.setFont(f1);add(useRGB_G);useRGB_G.setBounds(250, 720, 20, 50);useRGB_G.setFont(f1);add(useRGB_B);useRGB_B.setBounds(400, 720, 20, 50);useRGB_B.setFont(f1);/**将‘R,G,B’文本框加入JPanel* 设置‘R,G,B’文本框位置* 设置‘R,G,B’文本框字体*/add(R);R.setBounds(150, 720, 80, 50);R.setFont(f1);add(G);G.setBounds(300, 720, 80, 50);G.setFont(f1);add(B);B.setBounds(450, 720, 80, 50);B.setFont(f1);//将转换按钮加入JPaneladd(RGBbutton);//设置转换按钮位置RGBbutton.setBounds(550, 720, 100, 50);//设置转换按钮字体RGBbutton.setFont(f1);//设置转换按钮的事件监听为ActionListenerRGBbutton.addActionListener(this);jdialog.setSize(500,250);Container con = jdialog.getContentPane();prompt.setFont(f1);con.add(prompt);jdialog2.setSize(500,250);Container con2 = jdialog2.getContentPane();prompt2.setFont(f1);con2.add(prompt2);}//事件监听函数,用于监听单选按钮的发生public void itemStateChanged(ItemEvent e){int size = 25;if (rbt1.isSelected()){			//设置文字大小为10size = 10;}if (rbt2.isSelected()){			//设置文字大小为30size = 30;}if (rbt3.isSelected()){			//设置文字大小为50size = 50;}if(rbt4.isSelected()){textarea.setForeground(Color.RED);		//设置文字前景色(文字颜色)为红色}if(rbt5.isSelected()){textarea.setForeground(Color.YELLOW);	//设置文字前景色(文字颜色)为黄色}if(rbt6.isSelected()){textarea.setForeground(Color.BLUE);		//设置文字前景色(文字颜色)为蓝色}//设置多行文本区域文字大小为sizeFont font = new Font("仿宋", Font.PLAIN, size);textarea.setFont(font);}//事件监听函数,用于监听滑块动作,并更改字体大小以及数字显示public void stateChanged(ChangeEvent e){if(e.getSource() == slider){//更改数字显示Bottomcenterjlabel.setText("滑块的值是"+slider.getValue());//更改字体大小Font font = new Font("仿宋",Font.PLAIN,slider.getValue());textarea.setFont(font);}}//动作事件public void actionPerformed(ActionEvent e){/**触发按钮jbtn时更改文字前景颜色* (transform16To_R/G/B为十六进制转sRGB函数)*/if(e.getSource() == jbtn){if(jtextfield.getText().length() == 7){Color color = new Color(transform16To_R(jtextfield.getText()),transform16To_G(jtextfield.getText()),transform16To_B(jtextfield.getText()));textarea.setForeground(color);}else{/**此处十六进制代码只需判断JTextField中得到的字符串长度为7。* 满足:返回字体颜色;不满足:返回弹窗*/jdialog.setLocation(550,350);		//设置弹窗位置jdialog.setVisible(true);			//设置弹窗是否可见}}if(e.getSource() == RGBbutton){/**此处sRGB值需要判断每个JTextField是否为0~255之间的值。* 满足:返回字体颜色;不满足:返回弹窗*/if((Integer.parseInt(R.getText())>=0 && Integer.parseInt(R.getText())<=255)&&(Integer.parseInt(G.getText())>=0 && Integer.parseInt(G.getText())<=255)&&(Integer.parseInt(B.getText())>=0 && Integer.parseInt(B.getText())<=255)){Color color = new Color(Integer.parseInt(R.getText()),Integer.parseInt(G.getText()),Integer.parseInt(B.getText()));textarea.setForeground(color);}else{jdialog2.setLocation(550,350);		//设置弹窗位置jdialog2.setVisible(true);			//设置弹窗是否可见}}}//十六进制转Rpublic int transform16To_R(String RGB){if(RGB != null && !"".equals(RGB) && RGB.length() == 7){//截取十六进制字符串第1,2位,并将其转换为sRGB中R型整数int R = Integer.valueOf(RGB.substring( 1, 3 ), 16);//返回R型整数return R;}return 0;}//十六进制转Gpublic int transform16To_G(String RGB){if(RGB != null && !"".equals(RGB) && RGB.length() == 7){//截取十六进制字符串第3,4位,并将其转换为sRGB中G型整数int G = Integer.valueOf(RGB.substring( 3, 5 ), 16);//返回G型整数return G;}return 0;}//十六进制转Bpublic int transform16To_B(String RGB){if(RGB != null && !"".equals(RGB) && RGB.length() == 7){//截取十六进制字符串第5,6位,并将其转换为sRGB中B型整数int B = Integer.valueOf(RGB.substring( 5, 7 ), 16);//返回B型整数return B;}return 0;}
}

下面是主函数部分:

import javax.swing.*;public class Main {public static void main(String[] args) {NullLayout frame = new NullLayout("简单文本编辑器");frame.setLocation(300, 50);			//设置JFrame窗体位置frame.setSize(1000, 850);			//设置JFrame窗体大小frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		//设置JFrame窗体关闭时为直接结束程序进程frame.setVisible(true);				//设置JFrame窗体是否可见,默认false}}

最后展示代码运行成果!

 本人是Java的初学者,发布此文章也是希望能够帮助到更多的人,如有错误希望各位大佬能够为我批评指正!感谢各位的支持!


http://chatgpt.dhexx.cn/article/0UDam8vN.shtml

相关文章

Java设计文本编辑器

阿乐今天敲代码没 Java设计文本编辑器 前言一、实现功能二、扼要代码1.界面程序设计2.文件菜单设计3.编辑菜单栏设计4.格式菜单栏设计 运行截图 前言 利用Java设计一个文本编辑器。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、实现功能 该简易…

Java课设——文本编辑器

来自&#xff1a;https://blog.csdn.net/qq_39169598/article/details/84726959 原创不易&#xff0c;转载请加上作者 一、需求 编程实现一个文本编辑器&#xff0c;使其具有新建、打开、保存&#xff0c;编辑&#xff08;查找、替换、大小写转换等&#xff09;、统计&#…

用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行

Java做文本编辑器的项目&#xff0c;搜了下看到网上有各种版本的Java文本编辑器有很多种&#xff0c;但有的实现很麻烦&#xff0c;最近刚好在做这个实现就也发一个&#xff0c;代码写得很朴素&#xff0c;注释无比详细。 测试过没有Bug&#xff0c;如果有什么问题&#xff0c…

Java实现简单的文本编辑器

1、首先创建一个编辑器EditorDemo类&#xff0c;继承JFrame类&#xff0c;具体实现编码如下&#xff1a; 2、创建菜单栏&#xff0c;新增各个菜单项&#xff0c;比如文件、编辑、帮助等功能&#xff0c;新增createJMenuBar方法如下&#xff1a; /*** 创建菜单栏* param acti…

你知道在深圳一个月花多少钱吗?

在深圳一个月花多少钱&#xff0c;才能活得比较像样&#xff1f; 早上上班挤地铁转公共&#xff0c;7到10块钱&#xff0c;中午在公司叫一份外卖&#xff0c;22块钱到30块钱&#xff0c;晚上加班和同事一起吃饭&#xff0c;25块左右&#xff0c;赶上末班地铁7块钱&#xff0c;房…

开发一个app需要多少钱

APP应用开发主要分为原生APP和HTML5APP开发&#xff0c;使用HTML5开发的app价格不是很高&#xff0c;但是在体验上&#xff0c;访问速度上比原生的有差距。 第一、商城类app报价计算 以H5的封装案例&#xff0c;价格比较便宜&#xff0c;商城价格几万就能搞定&#xff0c;不会超…

一般培训python要多少钱

Python语言相对简单并且非常适合初学者&#xff0c;使初学者可以专注于编程逻辑&#xff0c;而不会陷入晦涩的语法细节中。 学习python提供了比其他任何编程语言更多的职业发展选择。 那么&#xff0c;python培训班一般要多少钱&#xff1f; 伴随着互联网技术的迅猛发展&…

微信小程序开发一个多少钱

小程序开发是当前比较流行的一项技术服务&#xff0c;能够为企业和个人带来巨大的商业价值和社会价值&#xff0c;但是小程序开发费用也是潜在的成本之一。在选择小程序开发服务时&#xff0c;了解开发费用如何计算、影响价格的因素以及如何降低成本等方面的知识&#xff0c;可…

开发一个App大概要多少钱?

结合自己的各种采坑失败经验以及周边个别成功试水经验&#xff0c;站在个人角度给出一些理解。 APP制作有多种形式&#xff0c;所以需要的成本差异较大。 1.寻找外包公司 2.模板APP&#xff08;内行叫SAAS&#xff09; 3.自己组建团队 目录 互联网外包公司的成本构成&#…

chatgpt赋能python:如何让Python暂停?

如何让Python暂停&#xff1f; Python是一种高级编程语言&#xff0c;常用于数据分析、机器学习等领域。在Python编程中&#xff0c;我们经常需要让程序执行暂停一段时间&#xff0c;等待某些操作完成。本文将介绍如何让Python暂停&#xff0c;以及如何在SEO中优化文章标题&am…

独家 | ChatGPT可以解决分级和分类这样的简单机器学习任务

作者&#xff1a;Damir Yalalov 翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约1100字&#xff0c;建议阅读5分钟 本文介绍了ChatGPT如何解决简单的机器学习任务并给出了鸢尾花分类和城市预测两个案例。 一句话概括&#xff1a; ChatGPT可以帮助你完成简单的机器学习任务…

分享 7 个不错的 AI 工具

人工智能的世界继续让我们着迷&#xff0c;近期的 OpenAI ChatGPT 掀起人们对人工智能的更大的期待&#xff0c;本文收集了 7 个人工智能 (AI) 工具&#xff0c;其中大部分易于使用&#xff0c;有些更复杂……比如构建 ML 模型。 1. GFP-GAN&#xff1a;照片修复 GFP-GAN 是一…

你们怎么都有自己的聊天机器人?给我也来一个!

点击左上方蓝字关注我们 PaddlePaddle Wechaty AI ChatBot创意赛正在火热进行中&#xff0c;人工智能时代的ChatBot需要具备哪些能力&#xff1f;由你来定义&#xff01;参赛的小伙伴们果然各显神通&#xff0c;快来pick你心中最中意的聊天机器人吧&#xff0c;并献上你珍贵的…

【AI绘画打卡】| 用漫画生成器绘制宅男最爱的二次元美女

二次元美女在日本文化中已经成为一种流行文化和艺术形式&#xff0c;包括漫画、动画等。由于此类作品的富有想象力、多样性和虚构&#xff0c;像二次元美女这样的虚拟角色往往可以充分满足人们的幻想和情感需求。这也是许多宅男在二次元世界寻找自己理想女友的原因之一。 作品…

进程地址空间详解

进程地址空间 文章目录 进程地址空间验证地址空间的基本排布进程地址空间究竟是什么&#xff1f; 地址空间和物理内存之间的关系为什么要存在地址空间&#xff1f; 我们在学习C语言期间&#xff0c;经常可以提及到这些区域&#xff0c;有一个问题&#xff1a;这里的地址空间是内…

【GlobalMapper精品教程】044:空间操作(1)——交集(Intersection)

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述交集工具的使用。 文章目录 一、实验数据二、符号化设置三、交集运算四、结果展示1. 运行提示2. 空间查看3. 属性表查看五、心灵感…

PostgreSQL的表空间

PostgreSQL之表空间 1、什么是PG中的表空间&#xff08;tablespace&#xff09;&#xff1f; pg中的表空间实际上就是文件系统中的一个目录, 是pg中数据库对象&#xff08;包括表、索引等&#xff09;的容器。 Pg使用操作系统的文件系统进行对象存储&#xff0c;每个数据库对…

Oracle表空间、用户详解

目录 新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态 删除表空间查询 用户创建删除查询修改 新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c…

49-Linux_malloc及4G虚拟空间分布

文章目录 malloc及4G虚拟空间分布1.malloc2.32位操作系统进程的4G虚拟空间分布1) 代码区(Text egment)&#xff1a;2) 全局初始化数据区/静态数据区(Data Segment)3) 未初始化数据区(BSS)&#xff1a;4) 堆区(heap)&#xff1a;5) 栈区(stack)&#xff1a; malloc及4G虚拟空间分…

(微信开发)Laya转发H5网页到微信,带图片

网页转发到微信时&#xff0c;带图片和自定义标题。2022年11月22号 关键解说 _wx.config({ debug: _wx_configdebug, appId: e.appId, timestamp: e.timestamp, nonceStr: e.nonceStr, signature: e.signature, jsApiList: [ // 所有要调用的 API 都要加到这个列表中 ‘onMen…