最近想做一个弹幕工具,貌似还没找到好的,就手写一个咯,由于对 swing 不熟悉,jframe
的属性设置也是一把泪~各种细节慢慢调了好久才调好,其实还挺简单的,也没几行代码 ~
上码:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
@SuppressWarnings("serial")
public class BarrageManager extends JFrame {
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
private Font FONT = new Font("宋体", Font.BOLD, 25);
private List<JLabel> labelList = new ArrayList<JLabel>();
private Random random = new Random();
public static void main(String[] args) {
BarrageManager manager = new BarrageManager();
manager.add("asdfasdf");
manager.add("dddddd");
manager.add("sssss");
manager.add("aaaaa");
manager.add("aaaaa5454");
while (true) {
manager.move();
try {
Thread.sleep(25);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public BarrageManager() {
this.setSize(screenSize.width, screenSize.height);
// 隐藏窗口标题
this.setUndecorated(true);
this.setBackground(new Color(0, 0, 0, 0));
this.setLocationByPlatform(true);
this.setResizable(false);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
// 隐藏任务栏窗口
this.setType(JFrame.Type.UTILITY);
this.setVisible(true);
this.setAlwaysOnTop(true);
}
/**
* 添加弹幕
* @param text
*/
public void add(String text) {
// 计算文本大约宽度
int textWidth = text.length() * FONT.getSize() + 10;
JLabel label = new JLabel(text);
label.setFont(FONT);
label.setForeground(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
label.setBounds(screenSize.width, random.nextInt(screenSize.height), textWidth, FONT.getSize());
labelList.add(label);
this.add(label);
}
int width = screenSize.width;
/**
* 执行弹幕移动
*/
public void move() {
Iterator<JLabel> it = labelList.iterator();
while (it.hasNext()) {
JLabel label = it.next();
label.setLocation(--width, label.getY());
if (label.getX() + label.getWidth() < 0) {
this.remove(label);
it.remove();
}
}
}
}