Flash中的逐帧动画可以实现文本移动显示的效果,java程序也可以实现类似效果哦。
1.Ticker类继承Canvas,实现Runnable接口。用Canvas中的paint方法控制字符串的移动位置。
2.TickerFrame 类继承Frame,实现ActionListener窗口,添加两个按钮来控制文本的移动和停止。
核心部分:
字符串快要离开显示区域是,需要复位减少的x坐标值。由于那时的x坐标值和文本宽度相等,这就意味着需要确定字符串的宽度。而字符串宽度依赖于选定的字体、字号和外观。这里使用了FontMetrics类,用它能获得关于特定字体信息、度量一个字符串在特定字体情况下的尺寸。但此类是抽象类,不能被实例化,所以还应该使用一个getFontMetrics方法来获得FontMetrics对象的引用。
代码如下:
1importjava.awt.*;2importjava.awt.event.*;3classTickerextendsCanvasimplementsRunnable4{5//定义字符串位置坐标6PRivateintx,y;7//定义整型变量用来存储字符串的高度,宽度8privateintheight,width;9privateThread runner=null;10//定义字符串11privateString text=null;12//FontMetrics类可以测出具有特定字体的字符大小,但是是抽象类,不能直接被实例化,1314privateFontMetrics metrics =null;15privateFont font=newFont("Monospaced",Font.BOLD,50);1617publicTicker(String _text)18{19text=_text;20//使用getFontMetrics方法,返回一个FontMetrics对象的引用21metrics=getFontMetrics(font);22//高度等于这种字体的高度23height=metrics.getHeight();24//宽度等于字符串的宽25width=metrics.stringWidth(text);2627x=getSize().width;28y=height;2930//Ticker的尺寸至少应该和文本一般大31setSize(width,height+2);3233}34//自定义线程启动的方法35publicvoidstart()36{37if(runner==null)38{39runner=newThread(this);40runner.start();41}42}43//自定义停止线程的方法44publicvoidstop()45{runner=null;}4647//实现run方法48publicvoidrun()49{50Thread currentThread =Thread.currentThread();51while(runner==currentThread)52{53//自定义方法,使字符串向左移动坐标改变54computeCoordinates();55//重绘56repaint();57try58{59runner.sleep(30);60}61catch(InterruptedException ie)62{63System.err.println("Error:"+ie);64}65}66}67//重写父类的paint()方法68publicvoidpaint(Graphics g)69{70g.setColor(Color.blue);71g.setFont(font);72g.drawString(text,x,y);73}7475privatevoidcomputeCoordinates()76{77//当所有文本移到窗口外时,复位78if(x<-width)79x=getSize().width;80else81//坐标减小,已达到字符串向左移动的效果82x-=2;8384}8586}87publicclassTickerFrameextendsFrameimplementsActionListener88{
//定义两个按钮89privateButton start=newButton("Start");90privateButton stop=newButton("Stop");
//创建Ticker类对象91Ticker ticker=newTicker("实践中学习!");
//在构造方法中初始化窗口92publicTickerFrame()93{94super("移动的文本");95setLayout(newBorderLayout());96add("Center",ticker);
//新建一个容器97Panel p=newPanel();
//设置为流式布局98p.setLayout(newFlowLayout());
//把按钮添加到容器中,并为按钮注册监听器99p.add(start); start.addActionListener(this);100p.add(stop); stop.addActionListener(this);101add("South",p);
//用匿名内部类,为窗口注册监听器。102addWindowListener(newWindowAdapter()103{104publicvoidwindowClosing(WindowEvent we)105{106System.exit(0);107}108});109pack();
//使窗口可见110setVisible(true);111}
//实现接口的抽象方法,处理单击按钮的事件112publicvoidactionPerformed(ActionEvent ae)113{114if(ae.getSource()==start)115ticker.start();116else117if(ae.getSource()==stop)118ticker.stop();119120}121publicstaticvoidmain(String[] args)122{newTickerFrame();}123}
运行:
单击“Start”按钮,文本就会向左移动,单击“Stop”按钮,则移动停止;当所有文本移到窗口之外时,文本复位,再次向左移动。