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

Java Swing 自定义组件实现文字滚动效果

Java Swing 通过自定义组件结合后台线程实现文字滚动效果。核心逻辑是在独立线程中更新显示状态,并触发重绘。示例包含组件封装、线程池管理及测试入口,解决了界面卡顿问题,适合需要动态文本展示的场景。

RefactorPro发布于 2015/6/24更新于 2026/8/1859 浏览
Java Swing 自定义组件实现文字滚动效果

Java Swing 自定义组件实现文字滚动效果

在 Swing 开发中,如果需要在界面上实现类似跑马灯的滚动文字效果,直接操作组件往往会阻塞事件分发线程(EDT),导致界面假死。因此,最佳实践是利用独立线程来维护滚动状态,并通过 repaint 安全地刷新界面。

核心组件封装

我们创建一个继承自 JButton 的自定义组件 MyComponent。它内部维护一个标签用于显示当前文字,并通过一个独立的滚动线程来控制文字的切换和位置偏移。

import java.awt.Graphics;
import java.util.concurrent.ExecutorService;
import javax.swing.JButton;
import javax.swing.JLabel;

public class MyComponent extends JButton {
    private static final long serialVersionUID = 1L;
    private JLabel jl2;
    private String[] msg;
    private int x = 90, y = 17;
    private int i = 0;
    private Roll roll;
    private ExecutorService pool;
    public static boolean flag;

    public JLabel getJl2() {
        return jl2;
    }

    public void setJl2(JLabel jl2) {
        this.jl2 = jl2;
    }

    public MyComponent() {
        super();
        this.setLayout(null);
        jl2 = new JLabel();
        jl2.setBounds(0, 0, 100, 30);
        this.add(jl2);
    }

    /**
     * 设置显示值
     */
    public void setArrText(String[] msg) {
        this.msg = msg;
        if (msg != null && msg.length > 0) {
            flag = true;
            pool = ThreadGroupUtil.getInstance();
            if (roll == null) {
                roll = new Roll();
                pool.execute(roll);
            }
        } else {
            flag = false;
        }
    }

    /**
     * 滚动线程,当有业务值传进来时候,启动该线程
     */
    class Roll extends Thread {
        @Override
        public void run() {
            while (flag) {
                try {
                    Thread.sleep(100);
                    if (jl2.getText() != null) {
                        jl2.setText(null);
                    }
                } catch (InterruptedException e) {
                    // 忽略中断
                }

                if ((x -= 1) > -25) {
                    continue;
                }
                i = ++i % msg.length;
                try {
                    Thread.sleep(400);
                } catch (InterruptedException e) {
                    // 忽略中断
                }
                x = 90;
                // 触发重绘以更新界面
                repaint();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        if (msg != null) {
            if (i < msg.length) {
                g.drawString(msg[i], x, y);
            }
        }
    }
}

注意:原逻辑中在 paint 方法内调用 repaint() 会导致递归调用,这里将刷新指令移到了滚动线程的逻辑末尾,确保每次状态变更后安全触发重绘。

线程池管理工具

为了避免频繁创建销毁线程带来的开销,我们使用单例模式管理线程池。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadGroupUtil {
    private static ExecutorService pool = null;
    private static int size;

    static {
        size = 400;
        System.out.println(size);
        pool = Executors.newFixedThreadPool(size);
    }

    /**
     * 得到单例的线程池
     *
     * @return ExecutorService 线程池
     */
    public static ExecutorService getInstance() {
        return pool;
    }
}

测试运行

最后,编写一个简单的测试类来验证效果。

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestRoll extends JFrame {
    public TestRoll() {
        JPanel jp = new JPanel();
        jp.setLayout(null);
        MyComponent component = new MyComponent();
        component.setBounds(20, 30, 100, 30);
        jp.add(component);
        component.setArrText(new String[]{"张三", "李四", "王五"});
        this.getContentPane().add(jp);
        this.setSize(300, 300);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new TestRoll();
    }
}

实际运行时,你会发现文字会按照设定的间隔进行滚动切换。这种方案既保证了界面的响应速度,又实现了流畅的动画效果。

目录

  1. Java Swing 自定义组件实现文字滚动效果
  2. 核心组件封装
  3. 线程池管理工具
  4. 测试运行
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 离散傅里叶变换与 OpenCV 实现详解
  • 从零训练大语言模型:环境与代码实战指南
  • FDTD 算法仿真超透镜:参数调整与聚焦实现
  • DWR3 基于 Spring MVC 配置 Controller 的方法
  • 动态规划 01 背包问题详解、模板与空间优化
  • 基于 Unity 开发 Pico VR 基础应用:从环境搭建到实战部署
  • AI 产品经理指南:面试百人后的洞察与职业建议
  • 使用 SWIFT 框架微调 InternVL2-40B 模型
  • 腾讯云服务器部署 OpenClaw 对接飞书
  • 大语言模型推理端架构与 llama.cpp 核心实现解析
  • 魔搭社区:探索 LLM 大模型的应用与微调实践
  • MySQL 与 Oracle 视图的创建与使用
  • ModalAI VOXL2 与 ArduPilot 无 GPS 位置控制配置
  • C++优化LLaMA-3推理的GPU+CPU协同加速方案
  • 使用 KSWEB 在安卓手机部署 Typecho 博客并配置外网访问
  • 我的世界国际版 Java 与基岩版 PC 端安装及模组配置指南
  • SRS 流媒体服务器安装配置与使用指南
  • Java 8 新特性:Stream API 使用指南
  • 7 个鲜为人知但实用的 Python 工具库
  • C++ 测试与调试实战:保障代码质量与稳定性

相关免费在线工具

  • 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