swing 滾動文字

          Posted on 2009-02-12 14:46 閱讀(598) 評論(0)  編輯  收藏

           

          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;
          }  
                }


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          posts - 40, comments - 9, trackbacks - 0, articles - 9

          Copyright © 希

          主站蜘蛛池模板: 金川县| 陆丰市| 龙南县| 梁山县| 威信县| 全椒县| 望谟县| 正镶白旗| 米林县| 任丘市| 墨江| 利辛县| 苏州市| 文水县| 孝义市| 伊宁县| 龙胜| 册亨县| 利津县| 大同县| 仁布县| 乡城县| 绍兴县| 玉屏| 思南县| 泗阳县| 徐闻县| 淮北市| 绵竹市| 平谷区| 诸暨市| 都匀市| 达日县| 浏阳市| 井研县| 大竹县| 云南省| 那曲县| 旬阳县| 蒙山县| 翁源县|