• 初学多线程练习3--移动的文本


    Flash中的逐帧动画可以实现文本移动显示的效果,java程序也可以实现类似效果哦。

    1.Ticker类继承Canvas,实现Runnable接口。用Canvas中的paint方法控制字符串的移动位置。

    2.TickerFrame 类继承Frame,实现ActionListener窗口,添加两个按钮来控制文本的移动和停止。

    核心部分:

    字符串快要离开显示区域是,需要复位减少的x坐标值。由于那时的x坐标值和文本宽度相等,这就意味着需要确定字符串的宽度。而字符串宽度依赖于选定的字体、字号和外观。这里使用了FontMetrics类,用它能获得关于特定字体信息、度量一个字符串在特定字体情况下的尺寸。但此类是抽象类,不能被实例化,所以还应该使用一个getFontMetrics方法来获得FontMetrics对象的引用。

    代码如下:

      1 import java.awt.*;
      2 import java.awt.event.*;
      3 class Ticker extends Canvas implements Runnable
      4 {
      5     //定义字符串位置坐标
      6     private int x,y;
      7     //定义整型变量用来存储字符串的高度,宽度
      8     private int height,width;
      9     private Thread runner=null;
     10     //定义字符串
     11     private String text=null;
     12     //FontMetrics类可以测出具有特定字体的字符大小,但是是抽象类,不能直接被实例化,
     13     
     14     private FontMetrics metrics =null;
     15     private Font font=new Font("Monospaced",Font.BOLD,50);
     16 
     17     public Ticker(String _text)
     18     {
     19         text=_text;
     20         //使用getFontMetrics方法,返回一个FontMetrics对象的引用
     21         metrics=getFontMetrics(font);
     22         //高度等于这种字体的高度
     23         height=metrics.getHeight();
     24         //宽度等于字符串的宽
     25         width=metrics.stringWidth(text);
     26 
     27         x=getSize().width;
     28         y=height;
     29         
     30         //Ticker的尺寸至少应该和文本一般大
     31         setSize(width,height+2);
     32 
     33     }
     34     //自定义线程启动的方法
     35     public void start()
     36     {
     37         if(runner==null)
     38         {
     39             runner=new Thread(this);
     40             runner.start();
     41         }
     42     }
     43     //自定义停止线程的方法
     44     public void stop()
     45     {runner=null;}
     46 
     47     //实现run方法
     48     public void run()
     49     {
     50         Thread currentThread =Thread.currentThread();
     51         while(runner==currentThread)
     52         {
     53             //自定义方法,使字符串向左移动坐标改变
     54             computeCoordinates();
     55             //重绘
     56             repaint();
     57             try
     58             {
     59                 runner.sleep(30);
     60             }
     61             catch (InterruptedException ie)
     62             {
     63                 System.err.println("Error:"+ie);
     64             }
     65         }
     66     }
     67     //重写父类的paint()方法
     68     public void paint(Graphics g)
     69     {
     70         g.setColor(Color.blue);
     71         g.setFont(font);
     72         g.drawString(text,x,y);
     73     }
     74 
     75     private void computeCoordinates()
     76     {
     77         //当所有文本移到窗口外时,复位
     78         if(x<-width)
     79             x=getSize().width;
     80         else
     81             //坐标减小,已达到字符串向左移动的效果
     82             x-=2;
     83 
     84     }
     85 
     86 }
     87 public class TickerFrame extends Frame implements ActionListener
     88 {
    //定义两个按钮
    89 private Button start=new Button("Start"); 90 private Button stop=new Button("Stop");
    //创建Ticker类对象
    91 Ticker ticker=new Ticker("实践中学习!");
    //在构造方法中初始化窗口
    92 public TickerFrame() 93 { 94 super("移动的文本"); 95 setLayout(new BorderLayout()); 96 add("Center",ticker);
    //新建一个容器
    97 Panel p=new Panel();
    //设置为流式布局
    98 p.setLayout(new FlowLayout());
    //把按钮添加到容器中,并为按钮注册监听器
    99 p.add(start); start.addActionListener(this); 100 p.add(stop); stop.addActionListener(this); 101 add("South",p);
    //用匿名内部类,为窗口注册监听器。
    102 addWindowListener(new WindowAdapter() 103 { 104 public void windowClosing(WindowEvent we) 105 { 106 System.exit(0); 107 } 108 }); 109 pack();
    //使窗口可见
    110 setVisible(true); 111 }
    //实现接口的抽象方法,处理单击按钮的事件
    112 public void actionPerformed(ActionEvent ae) 113 { 114 if(ae.getSource()==start) 115 ticker.start(); 116 else 117 if(ae.getSource()==stop) 118 ticker.stop(); 119 120 } 121 public static void main(String[] args) 122 {new TickerFrame();} 123 }

    运行:

    单击“Start”按钮,文本就会向左移动,单击“Stop”按钮,则移动停止;当所有文本移到窗口之外时,文本复位,再次向左移动。

  • 相关阅读:
    Java架构师必知:什么是单点登录,主要会应用于哪些场景?
    15年老程序员首次分享,年薪200万是怎么做到的
    架构师进阶之路,什么人适合当架构师
    阿里大咖首次分享:软件工程危机真来了?
    用【快餐店】理解日均亿级高并发分布式架构,秒懂!
    Semi-supervised learning for Text Classification by Layer Partitioning
    Ordered Neurons: Integrating Tree Structures Into Recurrent Neural Networks
    Deep Learning Recommendation Model for Personalization and Recommendation Systems
    条件随机场
    隐马尔可夫模型
  • 原文地址:https://www.cnblogs.com/wsw-tcsygrwfqd/p/5008233.html
Copyright © 2020-2023  润新知