跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

利用 Java GUI 编写简单文本编辑器

综述由AI生成演示了基于 Java Swing 框架开发图形界面文本编辑器的全过程。项目采用 JFrame 作为主窗口,利用 NullLayout 进行绝对定位布局,集成了 JLabel、JSlider、JTextArea 等组件。核心功能包括动态调整字体大小、切换字体颜色(支持单选按钮及 RGB/Hex 输入)、滑块实时预览。代码展示了事件监听机制(ItemListener、ChangeListener、ActionListener)的应用及十六进制颜色码解析逻辑。此外,补充了文件保存功能的实现思路,完善了基础编辑器的完整性。

全栈工匠发布于 2025/2/6更新于 2026/6/222 浏览
利用 Java GUI 编写简单文本编辑器

利用 Java GUI 编写简单文本编辑器

概述

本教程旨在演示如何使用 Java Swing 库创建一个功能基础的图形界面(GUI)文本编辑器。通过继承 JFrame 类并实现多个事件监听接口,我们将构建一个包含字体大小调整、颜色切换及十六进制颜色转换功能的桌面应用。文章将详细解析布局管理、组件初始化及事件处理机制。

技术环境

  • 开发语言: Java (JDK 8 及以上)
  • 核心框架: Swing (javax.swing)
  • 布局方式: 空布局 (NullLayout),用于精确控制组件位置

核心组件与逻辑

1. 窗口与布局

主窗口继承自 JFrame,采用空布局管理器。虽然绝对定位在响应式设计中不推荐,但在教学示例中它能直观展示坐标控制。我们禁用了窗口大小调整功能,确保界面固定。

2. 交互组件

  • 字体控制: 使用 JRadioButton 组选择预设字号,配合 JSlider 滑块进行微调。
  • 颜色控制: 提供预设颜色(红/黄/蓝)单选按钮,以及自定义 RGB 和十六进制输入框。
  • 文本区域: JTextArea 作为主要编辑区,支持多行文本输入。

3. 事件监听

程序实现了三个关键监听器:

  • ItemListener: 处理单选按钮的状态变化。
  • ChangeListener: 监听滑块数值变动。
  • ActionListener: 响应按钮点击事件(如颜色转换)。

代码实现

主窗口类 (TextEditorFrame)

以下代码展示了窗口的初始化、组件布局及事件绑定逻辑。注意类名虽为 NullLayout,实际代表主窗口逻辑。

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 {
    /**
     * 序列化版本 ID,防止编译器警告
     */
          ;

    
         ();
         ();
         ();
    
    
         ();          
         ( + slider.getValue());
    
         ();
         ();
         ();
         ();
         ();
         ();
    
         (, );
         (, );
         (, );
         (, );
    
         ();
         ();
         ();
         ();
    
         ();
         ();
         ();
         ();
         ();
         ();
    
         (, , );
         (, Font.BOLD, );
         (, Font.PLAIN, );
         (, , );
         (, , );

    
      {
        (title);
        init();
    }

    
       {
        setLayout();
        setResizable();

        
        add(Topjlabel);
        Topjlabel.setBounds(, , , );
        Topjlabel.setFont(f1);

        btngroup.add(rbt1);
        btngroup.add(rbt2);
        btngroup.add(rbt3);
        add(rbt1); add(rbt2); add(rbt3);
        rbt1.setBounds(, , , );
        rbt2.setBounds(, , , );
        rbt3.setBounds(, , , );
        rbt1.setFont(f1); rbt2.setFont(f1); rbt3.setFont(f1);
        rbt1.addItemListener();
        rbt2.addItemListener();
        rbt3.addItemListener();

        
        add(textarea);
        textarea.setBounds(, , , );
        textarea.setFont(f2);

        
        add(Bottomjlabel);
        Bottomjlabel.setBounds(, , , );
        Bottomjlabel.setFont(f1);

        btngroup2.add(rbt4);
        btngroup2.add(rbt5);
        btngroup2.add(rbt6);
        add(rbt4); add(rbt5); add(rbt6);
        rbt4.setBounds(, , , );
        rbt5.setBounds(, , , );
        rbt6.setBounds(, , , );
        rbt4.setFont(f1); rbt5.setFont(f1); rbt6.setFont(f1);
        rbt4.addItemListener();
        rbt5.addItemListener();
        rbt6.addItemListener();

        
        add(Bottomjlabel2);
        Bottomjlabel2.setBounds(, , , );
        Bottomjlabel2.setFont(f1);

        add(Bottomcenterjlabel);
        Bottomcenterjlabel.setBounds(, , , );
        Bottomcenterjlabel.setFont(f1);

        add(slider);
        slider.setBounds(, , , );
        slider.setMajorTickSpacing();
        slider.setMinorTickSpacing();
        slider.setPaintLabels();
        slider.setPaintTicks();
        slider.setPaintTrack();
        slider.addChangeListener();

        
        add(transformtoRGB);
        transformtoRGB.setBounds(, , , );
        transformtoRGB.setFont(f1);

        add(jtextfield);
        jtextfield.setBounds(, , , );
        jtextfield.setFont(f1);

        add(jbtn);
        jbtn.setBounds(, , , );
        jbtn.setFont(f1);
        jbtn.addActionListener();

        
        add(useRGB_R);
        useRGB_R.setBounds(, , , );
        useRGB_R.setFont(f1);
        add(useRGB_G);
        useRGB_G.setBounds(, , , );
        useRGB_G.setFont(f1);
        add(useRGB_B);
        useRGB_B.setBounds(, , , );
        useRGB_B.setFont(f1);

        add(R);
        R.setBounds(, , , );
        R.setFont(f1);
        add(G);
        G.setBounds(, , , );
        G.setFont(f1);
        add(B);
        B.setBounds(, , , );
        B.setFont(f1);

        add(RGBbutton);
        RGBbutton.setBounds(, , , );
        RGBbutton.setFont(f1);
        RGBbutton.addActionListener();

        
        jdialog.setSize(, );
           jdialog.getContentPane();
        prompt.setFont(f1);
        con.add(prompt);

        jdialog2.setSize(, );
           jdialog2.getContentPane();
        prompt2.setFont(f1);
        con2.add(prompt2);
    }

    
    
       {
           ;
         (rbt1.isSelected()) {
            size = ;
        }
         (rbt2.isSelected()) {
            size = ;
        }
         (rbt3.isSelected()) {
            size = ;
        }
         (rbt4.isSelected()) {
            textarea.setForeground(Color.RED);
        }
         (rbt5.isSelected()) {
            textarea.setForeground(Color.YELLOW);
        }
         (rbt6.isSelected()) {
            textarea.setForeground(Color.BLUE);
        }
            (, Font.PLAIN, size);
        textarea.setFont(font);
    }

    
       {
         (e.getSource() == slider) {
            Bottomcenterjlabel.setText( + slider.getValue());
                (, Font.PLAIN, slider.getValue());
            textarea.setFont(font);
        }
    }

    
       {
         (e.getSource() == jbtn) {
             (jtextfield.getText().length() == ) {
                    (
                    transform16To_R(jtextfield.getText()),
                    transform16To_G(jtextfield.getText()),
                    transform16To_B(jtextfield.getText())
                );
                textarea.setForeground(color);
            }  {
                jdialog.setLocation(, );
                jdialog.setVisible();
            }
        }
         (e.getSource() == RGBbutton) {
             {
                   Integer.parseInt(R.getText());
                   Integer.parseInt(G.getText());
                   Integer.parseInt(B.getText());
                 ((rVal >=  && rVal <= ) && (gVal >=  && gVal <= ) && (bVal >=  && bVal <= )) {
                        (rVal, gVal, bVal);
                    textarea.setForeground(color);
                }  {
                    jdialog2.setLocation(, );
                    jdialog2.setVisible();
                }
            }  (NumberFormatException ex) {
                jdialog2.setLocation(, );
                jdialog2.setVisible();
            }
        }
    }

    
       {
         (RGB !=  && !.equals(RGB) && RGB.length() == ) {
             Integer.valueOf(RGB.substring(, ), );
        }
         ;
    }

       {
         (RGB !=  && !.equals(RGB) && RGB.length() == ) {
             Integer.valueOf(RGB.substring(, ), );
        }
         ;
    }

       {
         (RGB !=  && !.equals(RGB) && RGB.length() == ) {
             Integer.valueOf(RGB.substring(, ), );
        }
         ;
    }
}
private
static
final
long
serialVersionUID
=
1L
// --- 成员变量定义 ---
private
JLabel
Topjlabel
=
new
JLabel
"字体大小"
private
JLabel
Bottomjlabel
=
new
JLabel
"字体颜色"
private
JLabel
Bottomjlabel2
=
new
JLabel
"滑动标签"
// Slider 对象应在初始化后调用 getValue
private
JSlider
slider
=
new
JSlider
private
JLabel
Bottomcenterjlabel
=
new
JLabel
"滑块的值是"
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
"仿宋"
25
private
Font
f2
=
new
Font
"仿宋"
25
private
JDialog
jdialog
=
new
JDialog
this
"提示"
true
private
JDialog
jdialog2
=
new
JDialog
this
"提示"
true
// --- 构造器 ---
public
NullLayout
(String title)
super
// --- 初始化方法 ---
public
void
init
()
null
false
// 字体大小设置
100
20
200
50
400
20
200
50
600
20
200
50
800
20
200
50
this
this
this
// 文本区域
0
90
1000
400
// 字体颜色设置
100
510
200
50
400
510
200
50
600
510
200
50
800
510
200
50
this
this
this
// 滑块控制
100
580
150
50
300
580
200
50
550
580
300
50
10
5
true
true
true
this
// 十六进制颜色转换
100
650
150
50
250
650
120
50
400
650
100
50
this
// RGB 输入
105
720
20
50
250
720
20
50
400
720
20
50
150
720
80
50
300
720
80
50
450
720
80
50
550
720
100
50
this
// 弹窗配置
500
250
Container
con
=
500
250
Container
con2
=
// --- 事件监听函数 ---
@Override
public
void
itemStateChanged
(ItemEvent e)
int
size
=
25
if
10
if
30
if
50
if
if
if
Font
font
=
new
Font
"仿宋"
@Override
public
void
stateChanged
(ChangeEvent e)
if
"滑块的值是"
Font
font
=
new
Font
"仿宋"
@Override
public
void
actionPerformed
(ActionEvent e)
if
if
7
Color
color
=
new
Color
else
550
350
true
if
try
int
rVal
=
int
gVal
=
int
bVal
=
if
0
255
0
255
0
255
Color
color
=
new
Color
else
550
350
true
catch
550
350
true
// --- 辅助方法:十六进制转 RGB ---
public
int
transform16To_R
(String RGB)
if
null
""
7
return
1
3
16
return
0
public
int
transform16To_G
(String RGB)
if
null
""
7
return
3
5
16
return
0
public
int
transform16To_B
(String RGB)
if
null
""
7
return
5
7
16
return
0

主程序入口

import javax.swing.*; 

public class Main {
    public static void main(String[] args) {
        // 建议在 EDT 线程中启动 Swing 应用
        SwingUtilities.invokeLater(() -> {
            NullLayout frame = new NullLayout("简单文本编辑器");
            frame.setLocation(300, 50);
            frame.setSize(1000, 850);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

功能扩展建议

当前版本实现了基本的样式修改,但作为一个完整的文本编辑器,文件持久化是必要的。以下是添加'保存文件'功能的思路:

  1. 引入 JFileChooser: 使用 Swing 自带的文件选择对话框。
  2. 写入操作: 获取 textarea.getText() 内容,通过 FileWriter 写入用户选择的文件路径。
  3. 异常处理: 捕获 IOException 并提示用户。

示例代码片段:

private void saveFile() {
    JFileChooser fileChooser = new JFileChooser();
    int result = fileChooser.showSaveDialog(this);
    if (result == JFileChooser.APPROVE_OPTION) {
        File file = fileChooser.getSelectedFile();
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
            writer.write(textarea.getText());
            JOptionPane.showMessageDialog(this, "保存成功");
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "保存失败:" + e.getMessage());
        }
    }
}

总结

本示例完整展示了 Java Swing 的基础 GUI 编程流程。通过组合多种组件和监听器,实现了用户友好的交互体验。在实际开发中,建议结合 MVC 模式分离视图与逻辑,并使用更现代的布局管理器(如 GridBagLayout)以适应不同屏幕分辨率。

目录

  1. 利用 Java GUI 编写简单文本编辑器
  2. 概述
  3. 技术环境
  4. 核心组件与逻辑
  5. 1. 窗口与布局
  6. 2. 交互组件
  7. 3. 事件监听
  8. 代码实现
  9. 主窗口类 (TextEditorFrame)
  10. 主程序入口
  11. 功能扩展建议
  12. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python vs Java:AI 项目选型对比与实战建议
  • 单 OpenClaw 配置多 Agent、多 QQ 与飞书机器人
  • Linux 多线程:线程创建、等待与终止详解
  • Windows 10/11 部署 OpenClaw 指南:环境搭建与机器人互联
  • Linux 初探:历史溯源与常用指令速览
  • OpenClaw 手机端部署与实战:旧手机变 AI 智能终端
  • AI 编程工具对比:Cursor、GitHub Copilot 与 Claude Code
  • AI 大模型新型智算中心技术体系深度分析
  • 大模型 AI Agent 实现 Action 的机制与流程详解
  • 哈希集合巧解最长连续序列
  • Java JUnit NoSuchMethodError 异常排查与修复方案
  • FLUX.1 镜像部署指南:内置中文界面与场景优化
  • Coze 工作流与智能体自动化应用解析
  • ClawdBot (OpenClaw) 在 Discord 上部署 AI 机器人指南
  • 为什么 AI 产品经理日渐成为热门职业
  • 数据结构与算法核心知识点梳理及学习建议
  • Edge 边栏 Copilot 图标消失的修复方案
  • HOG+SVM 目标检测原理与 Python 实现
  • 李沐:大模型发展趋势与创业感悟
  • Coze扣子「百套AI工作流」模板合集

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online