Swing


          天行健 君子以自強不息

          posts - 69, comments - 215, trackbacks - 0, articles - 16
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Swing DayDayUP之四: Swing 酷炫文字

          Posted on 2009-07-16 20:31 zht 閱讀(2542) 評論(2)  編輯  收藏 所屬分類: Swing

                  前兩天玩三國,看到開頭的文字有個燈光劃過的藝術效果,又聯想到前段時間看到的TextLayout,就來感覺了,順手實現了下。


          效果圖如下:



          原理介紹:
                  其實很簡單,分以下幾步
          1、通過Shape shape = textLayout.getOutline(transform)取得一個text的shape信息。
          2、將這個shape設置為剪輯區域g2d.setClip(shape);
          3、使用一個漸進Paint填充當前區域GradientPaint paint = new GradientPaint(0, 0, Color.BLACK, 0, y, Color.WHITE, true);
                  g2d.fill(this.getBounds());
          主要是2,將一個text的shape設置成當前Graphics的剪輯區域,這樣每次填充的內容只有shape內的才會顯示出來。
          至于閃爍效果就很簡單了,可以和我一樣,啟動一個timer每次修改paint參數,repaint即可。
          根據paint的不同,就會有不同的發光效果,有興趣的可以多試幾種效果。

          代碼如下:

          package text;

          import java.awt.BorderLayout;
          import java.awt.Color;
          import java.awt.Dimension;
          import java.awt.Font;
          import java.awt.GradientPaint;
          import java.awt.Graphics;
          import java.awt.Graphics2D;
          import java.awt.RenderingHints;
          import java.awt.Shape;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.awt.event.KeyEvent;
          import java.awt.font.FontRenderContext;
          import java.awt.font.TextLayout;
          import java.awt.geom.AffineTransform;
          import java.awt.geom.Rectangle2D;

          import javax.swing.BorderFactory;
          import javax.swing.JComponent;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JPanel;
          import javax.swing.JScrollPane;
          import javax.swing.JSplitPane;
          import javax.swing.JTextArea;
          import javax.swing.JTree;
          import javax.swing.KeyStroke;
          import javax.swing.Timer;

          /**
           * 
           * 
          @author  zhangtao
           * @msn        zht_dream@hotmail.com
           * @mail    zht_dream@hotmail.com
           * Let's Swing together.
           
          */

          public class GradientText extends JComponent {

              
          public static void main(String[] args) {
                  GradientText gText 
          = new GradientText("zht_dream");

                  JPanel panel 
          = new JPanel(new BorderLayout());
                  JSplitPane splitPane 
          = new JSplitPane();
                  splitPane.setLeftComponent(
          new JScrollPane(new JTree()));
                  JTextArea textArea 
          = new JTextArea();
                  textArea.setEnabled(
          false);
                  StringBuffer text 
          = new StringBuffer();
                  text.append(
          "good good study\n");
                  text.append(
          "day day up\n\n");
                  text.append(
          "MSN:zht_dream@hotmail.com\n");
                  text.append(
          "Mail:zht_dream@hotmail.com\n");
                  text.append(
          "                     ----zhangtao");
                  textArea.setText(text.toString());
                  textArea.setFont(
          new Font("Dialog", Font.ITALIC, 20));

                  splitPane.setRightComponent(
          new JScrollPane(textArea));
                  splitPane.setDividerLocation(
          100);

                  panel.add(gText, BorderLayout.NORTH);
                  panel.add(splitPane, BorderLayout.CENTER);

                  JFrame frame 
          = new JFrame();
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setContentPane(panel);
                  frame.setSize(
          600500);
                  frame.setLocationRelativeTo(
          null);
                  frame.setVisible(
          true);
              }


              
          private int y = 0;
              
          private Font font = new Font("Times", Font.BOLD, 40);
              
          private String text = null;//new String("MSN:zht_dream@hotmail.com");

              ActionListener anAction 
          = new ActionListener() {
                  
          public void actionPerformed(ActionEvent e) {
                      System.exit(
          -1);
                  }

              }
          ;

              
          public GradientText(String text) {
                  
          this.text = text;
                  
          this.registerKeyboardAction(anAction, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW);
                  
          this.setBorder(BorderFactory.createEmptyBorder(10101010));
                  putClientProperty(
          "order"true);
                  Timer timer 
          = new Timer(50new ActionListener() {
                      
          public void actionPerformed(ActionEvent e) {
                          
          boolean order = Boolean.parseBoolean(getClientProperty("order").toString());
                          
          if (order) {
                              y 
          = y + getHeight() / 20;
                          }
           else {
                              y 
          = y - getHeight() / 20;
                          }

                          
          if (y > getHeight()) {
                              putClientProperty(
          "order"false);
                              y 
          = getHeight();
                          }

                          
          if (y < 0{
                              putClientProperty(
          "order"true);
                              y 
          = 0;
                          }

                          repaint();
                      }

                  }
          );
                  timer.start();
              }


              @Override
              
          public Dimension getPreferredSize() {
                  JLabel label 
          = new JLabel(text);
                  label.setFont(font);
                  
          return label.getPreferredSize();
              }


              @Override
              
          protected void paintComponent(Graphics g) {
                  
          super.paintComponent(g);
                  
          if (text == null || font == null || text.trim().length() == 0{
                      
          return;
                  }

                  Graphics2D g2d 
          = (Graphics2D) g;
                  g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                  FontRenderContext frc 
          = g2d.getFontRenderContext();
                  TextLayout textLayout 
          = new TextLayout(text, font, frc);
                  Rectangle2D textBounds 
          = textLayout.getBounds();
                  
          double sw = textBounds.getWidth();
                  
          double sh = textBounds.getHeight();
                  Dimension componetSize 
          = this.getSize();

                  
          double sx = (componetSize.getWidth() - 5/ sw;
                  
          double sy = (componetSize.getHeight() - 5/ sh;
                  AffineTransform transform 
          = new AffineTransform();
                  transform.translate(
          2, (sh - textLayout.getDescent() + 5* sy);
                  transform.scale(sx, sy 
          - 5 / componetSize.getWidth());
                  Shape shape 
          = textLayout.getOutline(transform);
                  g2d.draw(shape);
                  g2d.setClip(shape);
                  GradientPaint paint 
          = new GradientPaint(00, Color.BLACK, 0, y, Color.WHITE, true);
                  g2d.setPaint(paint);
                  g2d.fill(
          this.getBounds());
              }


              
          public String getText() {
                  
          return text;
              }


              
          public void setText(String text) {
                  
          this.text = text;
                  
          this.repaint();
              }

          }


          參考:http://java.sun.com/developer/onlineTraining/Media/2DText/style.html
           

          主站蜘蛛池模板: 高密市| 噶尔县| 林周县| 瓦房店市| 德昌县| 庄河市| 万盛区| 陵川县| 永嘉县| 蓬莱市| 清镇市| 武宣县| 陇西县| 邢台市| 额尔古纳市| 广平县| 平湖市| 行唐县| 和政县| 红安县| 桂东县| 土默特左旗| 惠来县| 邳州市| 隆德县| 邹平县| 克东县| 麦盖提县| 云阳县| 红桥区| 南澳县| 安塞县| 仪征市| 荆门市| 崇信县| 泰州市| 太仓市| 石首市| 修武县| 宜丰县| 竹山县|