import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import cilent.ScreenMessage;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.image.*;
public class ScrollText extends JComponent
{
private BufferedImage image;
private Dimension imageSize;
private volatile int currOffset;
private Thread internalThread;
private volatile boolean noStopRequested;
private String scrollText;
public ScrollText(String text)
{
ScreenMessage m = new ScreenMessage();
currOffset=0;
buildImage("今天天氣不錯!over");
this.setMinimumSize(imageSize);
this.setPreferredSize(imageSize);
this.setMaximumSize(imageSize);
this.setSize(imageSize);
noStopRequested=true;
Runnable r=new Runnable()
{
public void run()
{
try
{
runWork();
}
catch(Exception e)
{
e.printStackTrace();
}
}
};
internalThread=new Thread(r,"ScrollText");
internalThread.start();
}
private void buildImage(String text)
{
//請求繪制時,打開反鋸齒,并運用高質量選項
RenderingHints renderHints=new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
renderHints.put(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
//創建一幅臨時圖像,用于判斷文件的大小
BufferedImage scratchImage=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
Graphics2D scratchG2=scratchImage.createGraphics();
scratchG2.setRenderingHints(renderHints);
Font font=new Font("宋體",Font.BOLD|Font.ITALIC,24);//Serif
FontRenderContext frc=scratchG2.getFontRenderContext();
TextLayout t1=new TextLayout(text,font,frc);
Rectangle2D textBounds=t1.getBounds();
int textWidth=(int)Math.ceil(textBounds.getWidth()); //設置滾動區的大小是字符串的大小
//int textWidth=ScreenMessage.width; //設置滾動區的大小
int textHeight=(int)Math.ceil(textBounds.getHeight());
// int textHeight = ScreenMessage.height/10;
int horizontalPad=0;
int verticalPad=6;
imageSize=new Dimension(textWidth+horizontalPad,textHeight+verticalPad);
//創建適當大小的圖像
image=new BufferedImage(imageSize.width,imageSize.height,BufferedImage.TYPE_INT_RGB);
Graphics2D g2=image.createGraphics();
g2.setRenderingHints(renderHints);
int baselineOffset=(verticalPad/2)-((int)textBounds.getY());
g2.setColor(Color.white);
g2.fillRect(0,0,imageSize.width,imageSize.height);
g2.setColor(Color.black);
t1.draw(g2,0,baselineOffset);
//立即釋放資源,但保持動畫顯示圖像
scratchG2.dispose();
scratchImage.flush();
g2.dispose();
}
public void paint(Graphics g)
{
//不論當前大小,確保裁減邊緣
g.setClip(0,0,imageSize.width,imageSize.height);
int localOffset=currOffset; //以防改變
g.drawImage(image,-localOffset,0,this);
g.drawImage(image,imageSize.width-localOffset,0,this);
/*//繪制輪廓
g.setColor(Color.black);
g.drawRect(0,0,imageSize.width-1,imageSize.height-1); */
}
private void runWork()
{
while(noStopRequested)
{
try
{
Thread.sleep(50); //每秒10幀
//調整滾動位置
currOffset=(currOffset+1)%imageSize.width;
//通知事件線程調用paint()
repaint();
}
catch(InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
}
public void stopRequest()
{
noStopRequested=false;
internalThread.interrupt();
}
public boolean isAlive()
{
return internalThread.isAlive();
}
public static void main(String args[])
{
ScrollText st=new ScrollText("Java can do animation!");
JPanel p=new JPanel();
p.setLayout(new FlowLayout());
p.add(st);
JFrame f=new JFrame("ScrollText Demo");
f.setContentPane(p);
}
public String getScrollText() {
return scrollText;
}
public void setScrollText(String scrollText) {
this.scrollText = scrollText;
}
}