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;
}
{
();
.setLayout();
jl2 = ();
jl2.setBounds(, , , );
.add(jl2);
}
{
.msg = msg;
(msg != && msg.length > ) {
flag = ;
pool = ThreadGroupUtil.getInstance();
(roll == ) {
roll = ();
pool.execute(roll);
}
} {
flag = ;
}
}
{
{
(flag) {
{
Thread.sleep();
(jl2.getText() != ) {
jl2.setText();
}
} (InterruptedException e) {
}
((x -= ) > -) {
;
}
i = ++i % msg.length;
{
Thread.sleep();
} (InterruptedException e) {
}
x = ;
repaint();
}
}
}
{
.paint(g);
(msg != ) {
(i < msg.length) {
g.drawString(msg[i], x, y);
}
}
}
}

