这里要实现的特效中有其中两个是动态的,所以要使用Java的多线程技术,通过实现Runnable接口中的run()方法实现的,在实现动态显示时,要使用多线程技术,基本的实现是这样的
Thread t = new Thread(panel7); //实现Runnable接口的类创建的对象
t.start();
this.add(panel7);
本文提及的文字特效具体实现效果如下
接下来一个一个实例进行分析
(一)会变色的文字
通过重写JComponent类的paint()方法,并实现Runnable接口中的run()方法实现的,其中paint()方法中添加的代码用于绘制文本,run()方法中的代码用于随机获得颜色的RGB值,并创建Color对象。
public class ChangeColorTextPanel extends JPanel implements Runnable {
Color color =new Color(0,0,255);
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
String value = "会变色的文字";
int x = 2;
int y = 90;
Font font = new Font("楷体",Font.BOLD,40);
g2.setFont(font);
g2.setColor(color);
g2.drawString(value, x, y);
}
@Override
public void run() {
Random random = new Random();
while(true) {
int R = random.nextInt(256);
int G = random.nextInt(256);
int B = random.nextInt(256);
color = new Color(R,G,B);
repaint();
try {
Thread.sleep(300);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
(二)水印文字特效
通过Graphics2D类的setComposite()方法,为绘图上下文指定表示透明度的AlphaComposite对象实现的。
(1)使用AlphaComposite类获得表示透明度的AlphaComposite对象,该对象使用AlphaComposite类的字段SrcOver调用derive()方法获得
public AlphaComposite derive(float alpha);
//alpha是闭区间0.0f~1.0f之间的一个浮点数字,为0.0f时完全透明,为1.0f时不透明
//返回值:表示透明度的AlphaComposite对象
(2)使用Graphics2D类的setComposite()方法,为绘图上下文指定表示透明度的AlphaComposite对象
public abstract void setComposite(Composite comp);
//comp是表示透明度的AlphaComposite对象
public class WatermarkTextPanel extends JPanel {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
ImageIcon img = new ImageIcon("0.jpg");
g2.drawImage(img.getImage(), 0, 0, 800, 337, this);
g2.rotate(Math.toRadians(-30));
Font font = new Font("楷体",Font.BOLD,60);
g2.setFont(font);
g2.setColor(Color.WHITE);
AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.3f);
g2.setComposite(alpha);
g2.drawString("Java编程", 100, 300);
}
}
(三)动态绘制文本
使用线程和BufferedReader缓冲流从指定文件中读取一个字符,然后绘制该字符,改变下一个字符绘制点的x、y坐标值,最终完成动态绘制文本的功能。
(1)使用System类的getProperty()方法,并为其传递实参字符串user.dir,这样就可以获得项目的当前路径
public static String getProperty(String key);
//系统属性的名称,返回值是返回系统属性的字符串值,如果没有指定键的属性,则返回null
(2)使用BufferedReader类的read()方法,从文本中读取一个字符
public int read() throws IOException;
//返回值是作为一个范围从0~65535整数读入的字符,如果已到达流末尾,则返回-1;IOException是如果发生I/O错误,则抛出IOException异常
public class DynamicDrawTextPanel extends JPanel implements Runnable {
private BufferedReader read;
int x = 20;
int y = 30;
String value = "";
public DynamicDrawTextPanel() {
String projectPath = System.getProperty("user.dir");
String filePath = projectPath + "/src/dyn.txt";
InputStream in = null;
try {
in = new FileInputStream(filePath);
}catch(FileNotFoundException e) {
e.printStackTrace();
}
read = new BufferedReader(new InputStreamReader(in));
}
public void paint(Graphics g) {
Font font = new Font("华文楷体",Font.BOLD,20);
g.setFont(font);
g.setColor(Color.RED);
g.drawString(value, x, y);
}
@Override
public void run() {
// TODO Auto-generated method stub
int len = 0;
try {
while((len = read.read())!=-1) {
Thread.sleep(400);
value = String.valueOf((char)len);
if(value.equals("\n")||value.equals("\r")) {
x = 20;
y += 15;
}
else {
x += 20;
}
repaint();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}