<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Swing


    天行健 君子以自強不息

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

    Swing DayDayUP之四: Swing 酷炫文字

    Posted on 2009-07-16 20:31 zht 閱讀(2535) 評論(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
     

    主站蜘蛛池模板: 在线观看AV片永久免费| 国产乱辈通伦影片在线播放亚洲| 亚洲人成色77777在线观看| 国产乱色精品成人免费视频| aa级女人大片喷水视频免费| 久久久久亚洲av无码专区| 国产小视频免费观看| 日本免费一区二区三区| 亚洲成a∨人片在无码2023| 亚洲Av无码专区国产乱码DVD| 久久精品a一国产成人免费网站| 一级做受视频免费是看美女| 久久久久亚洲av无码专区导航 | 国产精品视频全国免费观看| 久久精品国产亚洲AV无码娇色| 精品国产精品久久一区免费式| 国内精品久久久久影院免费| 亚洲一本一道一区二区三区| 亚洲AV无码久久精品蜜桃| 国产一级高清免费观看| 免费专区丝袜脚调教视频| 精品国产福利尤物免费| 亚洲人成色777777老人头| 香蕉视频在线观看亚洲| 亚洲成A人片77777国产| 毛片免费全部播放一级| 99热在线免费观看| 男女一边摸一边做爽的免费视频 | 黄色免费网址大全| 亚洲精品福利你懂| 亚洲国产综合专区在线电影| 亚洲国产精品毛片av不卡在线| 国产美女在线精品免费观看| 久久综合国产乱子伦精品免费| 一区二区三区免费看| 亚洲AV日韩AV无码污污网站| 亚洲人成电影在线观看网| 久久亚洲美女精品国产精品| 亚洲欧洲无码AV电影在线观看 | 91情国产l精品国产亚洲区| 亚洲人成77777在线播放网站|