自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java7的一個新類JLayer:裝飾的Swing組件

開發(fā) 后端
Java7中的一個新的類,JLayer,也已被添加到提高的Java Swing的能力。 JLayer主要用于裝飾的Swing組件。你可以用它改變?nèi)绾卫L制組件,以及它們?nèi)绾雾憫?yīng)事件。

Java7中的一個新的類,JLayer,也已被添加到提高的Java Swing的能力。 JLayer主要用于裝飾的Swing組件。你可以用它改變?nèi)绾卫L制組件,以及它們?nèi)绾雾憫?yīng)事件。

下面是這個類的一個簡單的例子:

先看運行結(jié)果:

1、鼠標(biāo)進入登陸框時:聚光燈效果(Spotlight)

 

2、點擊登錄按鈕:

  1. import java.awt.AWTEvent;  
  2. import java.awt.AlphaComposite;  
  3. import java.awt.BasicStroke;  
  4. import java.awt.Color;  
  5. import java.awt.Composite;  
  6. import java.awt.Font;  
  7. import java.awt.Graphics;  
  8. import java.awt.Graphics2D;  
  9. import java.awt.Image;  
  10. import java.awt.Point;  
  11. import java.awt.RadialGradientPaint;  
  12. import java.awt.RenderingHints;  
  13. import java.awt.event.ActionEvent;  
  14. import java.awt.event.ActionListener;  
  15. import java.awt.event.FocusAdapter;  
  16. import java.awt.event.FocusEvent;  
  17. import java.awt.event.ItemEvent;  
  18. import java.awt.event.ItemListener;  
  19. import java.awt.event.MouseEvent;  
  20. import java.beans.PropertyChangeEvent;  
  21. import javax.swing.ImageIcon;  
  22. import javax.swing.JButton;  
  23. import javax.swing.JCheckBox;  
  24. import javax.swing.JComponent;  
  25. import javax.swing.JFrame;  
  26. import javax.swing.JLabel;  
  27. import javax.swing.JLayer;  
  28. import javax.swing.JPanel;  
  29. import javax.swing.JPasswordField;  
  30. import javax.swing.JTextField;  
  31. import javax.swing.SwingUtilities;  
  32. import javax.swing.Timer;  
  33. import javax.swing.UIManager;  
  34. import javax.swing.plaf.LayerUI;  
  35. /**  
  36.  * @author http://blog.csdn.net/Cannel_2020  
  37.  *  
  38.  */ 
  39. public class TestJLayer {  
  40.     private static JFrame loginFrame;  
  41.     private LoginLayerUI layerUI;//LayerUI的一個子類  
  42.     public static void main(String[] args) {  
  43.         try {  
  44.             UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");     
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.           
  49.         javax.swing.SwingUtilities.invokeLater(new Runnable() {  
  50.             public void run() {  
  51.                 new TestJLayer().createUI();  
  52.             }  
  53.         });  
  54.     }  
  55.     public void createUI() {  
  56.           
  57.         loginFrame = new JFrame("From Cannel_2020's blog(CSDN)");  
  58.         loginFrame.setSize(340260);  
  59.         loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  60.         loginFrame.setLocationRelativeTo(null);  
  61.           
  62.         JPanel panel = createPanel();  
  63.         layerUI = new LoginLayerUI();  
  64.         /*  
  65.          * JLayer的構(gòu)造函數(shù):JLayer(V view, LayerUI<V> ui),  
  66.          * 第一個參數(shù)view為Component的一個子類,就是要要裝飾的Swing組件  
  67.          * 第二個參數(shù)為LayerUI<V>的一個實例,指定  
  68.          */ 
  69.         JLayer<JPanel> jlayer = new JLayer<JPanel>(panel, layerUI);  
  70.         //注意這個add的是JLayer<JPanel>的一個實例  
  71.         loginFrame.add(jlayer);  
  72.         loginFrame.setVisible(true);  
  73.     }  
  74.  
  75.     private JPanel createPanel() {  
  76.         final Image background = new ImageIcon("image/background.jpg").getImage();//背景圖片  
  77.         JPanel panel = new JPanel() {  
  78.             private static final long serialVersionUID = 6246862165441423926L;  
  79.             public void paintComponent(Graphics g) {  
  80.                 super.paintComponent(g);  
  81.                 Graphics2D g2d = (Graphics2D) g;  
  82.                 g2d.drawImage(background, 00, loginFrame.getWidth(),  
  83.                         loginFrame.getHeight(), this);  
  84.             }  
  85.         };  
  86.         panel.setLayout(null);  
  87.           
  88.           
  89.         Font font = new Font("微軟雅黑",Font.PLAIN,14);  
  90.         JLabel accountLabel = new JLabel("賬號:");  
  91.         accountLabel.setFont(font);  
  92.         accountLabel.setBounds(40604015);  
  93.         JLabel pswLabel = new JLabel("密碼:");  
  94.         pswLabel.setFont(font);  
  95.         pswLabel.setBounds(40984015);  
  96.           
  97.         final JTextField userName = new JTextField();  
  98.         userName.setFont(font);  
  99.         userName.setBounds(885315533);  
  100.         userName.addFocusListener(new FocusAdapter(){  
  101.             public void focusGained(FocusEvent e) {  
  102.                 userName.selectAll();  
  103.             }  
  104.         });  
  105.         JPasswordField password = new JPasswordField();  
  106.         password.setBounds(889015533);  
  107.         JLabel registerLabel = new JLabel("注冊");  
  108.         registerLabel.setFont(font);  
  109.         registerLabel.setBounds(260602819);  
  110.         JLabel findBackLabel = new JLabel("找回");  
  111.         findBackLabel.setFont(font);  
  112.         findBackLabel.setBounds(260982819);  
  113.           
  114.         JCheckBox rmbCBox = new JCheckBox("記住密碼");  
  115.         rmbCBox.setSelected(true);  
  116.         rmbCBox.setBounds(901407714);  
  117.         rmbCBox.addItemListener(new ItemListener(){  
  118.             public void itemStateChanged(ItemEvent e) {  
  119.                 if(e.getStateChange() == ItemEvent.DESELECTED){  
  120.                     System.out.println("rmbCBox(JCheckBox)被選中!");  
  121.                 }  
  122.             }  
  123.         });  
  124.         JCheckBox autoCBox = new JCheckBox("自動登錄");  
  125.         autoCBox.setBounds(1751407714);  
  126.           
  127.         JButton setButton = new JButton("設(shè)置");  
  128.         setButton.setBounds(501707527);  
  129.           
  130.         JButton loginButton = new JButton("登錄");  
  131.         loginButton.setFont(font);  
  132.         loginButton.setBounds(901707527);  
  133.         //5秒鐘后停止  
  134.         final Timer stopper = new Timer(5000new ActionListener() {  
  135.             public void actionPerformed(ActionEvent ae) {  
  136.                 layerUI.stop();  
  137.             }  
  138.         });  
  139.         stopper.setRepeats(false);//設(shè)置計時器只在第一次時觸發(fā)然后停止  
  140.  
  141.         loginButton.addActionListener(new ActionListener() {  
  142.             public void actionPerformed(ActionEvent ae) {  
  143.                 layerUI.start();  
  144.                 //若stopper不是在運行,則啟動stopper。  
  145.                 if (!stopper.isRunning()) {  
  146.                     stopper.start();  
  147.                 }  
  148.             }  
  149.         });  
  150.           
  151.         JButton exitButton = new JButton("退出");  
  152.         exitButton.setFont(font);  
  153.         exitButton.setBounds(1701707527);  
  154.         exitButton.addActionListener(new ActionListener()  
  155.         {  
  156.             public void actionPerformed(ActionEvent e) {  
  157.                 System.exit(0);  
  158.             }  
  159.               
  160.         });  
  161.           
  162.         panel.add(userName);  
  163.         panel.add(password);  
  164.         panel.add(accountLabel);  
  165.         panel.add(pswLabel);  
  166.         panel.add(registerLabel);  
  167.         panel.add(findBackLabel);  
  168.         panel.add(rmbCBox);  
  169.         panel.add(autoCBox);  
  170.         panel.add(loginButton);  
  171.         panel.add(exitButton);  
  172.           
  173.         return panel;  
  174.  
  175.  
  176.     }  
  177. }  
  178. class LoginLayerUI extends LayerUI<JPanel> implements ActionListener {  
  179.  
  180.     private static final long serialVersionUID = 1L;  
  181.     private boolean mIsRunning = false;// 點擊按鈕之后所觸發(fā)的線程是否在運行  
  182.     private boolean mIsFadingOut = false;//控制線程的停止,和處理  
  183.     private Timer mTimer;// 在指定時間間隔觸發(fā)一個或多個 ActionEvent。  
  184.  
  185.     private int mAngle = 0;//用于旋轉(zhuǎn)時計算角度  
  186.     private int mFadeCount = 0;//結(jié)合mFadeLimit用于設(shè)置針形旋轉(zhuǎn)圖案整體的漸變的效果  
  187.     private int mFadeLimit = 30;  
  188.  
  189.     private boolean mActive;// 是否進入窗口內(nèi)  
  190.     private int mX, mY;// 記錄鼠標(biāo)的坐標(biāo)  
  191.     /*  
  192.      * 渲染效果的過程中會不斷調(diào)用paint  
  193.      */ 
  194.     public void paint(Graphics g, JComponent c) {  
  195.         int w = c.getWidth();//獲取組件c的寬度  
  196.         int h = c.getHeight();  
  197.         super.paint(g, c);//調(diào)用父類的paint方法,繪畫組件c  
  198.  
  199.         Graphics2D g2 = (Graphics2D) g.create();  
  200.         // 設(shè)置聚光燈(Spotlight)效果  
  201.         if (mActive) {  
  202.             // 創(chuàng)建徑向漸變,中間透明。  
  203.             java.awt.geom.Point2D center = new java.awt.geom.Point2D.Float(mX,  
  204.                     mY);  
  205.             float radius = 72;  
  206.             float[] dist = { 0.0f, 1.0f };  
  207.             Color[] colors = { new Color(0.0f, 0.0f, 0.0f, 0.0f), Color.black };  
  208.             //RadialGradientPaint 類提供使用圓形輻射顏色漸變模式填充某一形狀的方式  
  209.             RadialGradientPaint p = new RadialGradientPaint(center, radius,  
  210.                     dist, colors);  
  211.             //setPaint:為 Graphics2D 上下文設(shè)置 Paint 屬性  
  212.             g2.setPaint(p);  
  213.             /*為 Graphics2D 上下文設(shè)置 Composite。   
  214.              *Composite 用于所有繪制方法中,如 drawImage、drawString、draw 和 fill  
  215.              *這里使用AlphaComposite 類實現(xiàn)一些基本的 alpha 合成規(guī)則  
  216.              *將源色與目標(biāo)色組合,在圖形和圖像中實現(xiàn)混合和透明效果  
  217.              */ 
  218.             g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,  
  219.                     .6f));  
  220.             //填充是繪畫  
  221.             g2.fillRect(00, c.getWidth(), c.getHeight());  
  222.         }  
  223.           
  224.           
  225.         if (!mIsRunning) {  
  226.             return;  
  227.         }  
  228.         float fade = (float) mFadeCount / (float) mFadeLimit;  
  229.         //fade的不同形成:12根針整體剛才出現(xiàn)的漸變效果,和登錄成功后的針消失過程的漸變效果  
  230.         g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,  
  231.                 .5f * fade));  
  232.         g2.fillRect(00, w, h);  
  233.  
  234.         int s = Math.min(w, h) / 5;  
  235.         int cx = w / 2;  
  236.         int cy = h / 2;  
  237.         /* 為呈現(xiàn)算法設(shè)置單個首選項的值。  
  238.          * RenderingHints.KEY_ANTIALIASING:抗鋸齒提示鍵。  
  239.          * RenderingHints.VALUE_ANTIALIAS_ON:抗鋸齒提示值——使用抗鋸齒模式完成呈現(xiàn)  
  240.          */ 
  241.         g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
  242.                 RenderingHints.VALUE_ANTIALIAS_ON);  
  243.  
  244.         /*  
  245.          *  setStroke:設(shè)置呈現(xiàn)過程中要畫的圖形  
  246.          * BasicStroke 類定義針對圖形圖元輪廓呈現(xiàn)屬性的一個基本集合  
  247.          */ 
  248.         g2.setStroke(new BasicStroke(s / 4, BasicStroke.CAP_ROUND,  
  249.                 BasicStroke.JOIN_ROUND));  
  250.         //設(shè)置繪畫顏色  
  251.         g2.setPaint(Color.white);  
  252.         /* rotate:旋轉(zhuǎn)轉(zhuǎn)換連接  
  253.          * 第一個參數(shù) Math.PI * mAngle / 180:旋轉(zhuǎn)的角度,以弧度為單位  
  254.          * 第二個參數(shù) cx:x - 旋轉(zhuǎn)原點的 x 坐標(biāo)  
  255.          * 第二個參數(shù) cy:y - 旋轉(zhuǎn)原點的 y 坐標(biāo)  
  256.          */ 
  257.         g2.rotate(Math.PI * mAngle / 180, cx, cy);  
  258.           
  259.         //12跟針,各個針的顏色是不同的,針與針之間形成漸變的效果  
  260.         for (int i = 0; i < 12; i++) {  
  261.             float scale = (11.0f - (float) i) / 11.0f;  
  262.             g2.drawLine(cx + s, cy, cx + s * 2, cy);  
  263.             g2.rotate(-Math.PI / 6, cx, cy);  
  264.             //通過設(shè)置AlphaComposite.getInstance()第二個參數(shù)的不同來實現(xiàn)12“針”顏色的不同  
  265.             g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,  
  266.                     scale * fade));  
  267.         }  
  268.         //釋放此圖形的上下文以及它使用的所有系統(tǒng)資源。   
  269.         g2.dispose();  
  270.     }  
  271.  
  272.     public void installUI(JComponent c) {  
  273.         super.installUI(c);  
  274.         JLayer jlayer = (JLayer) c;  
  275.         // 啟動鼠標(biāo)事件和鼠標(biāo)移動事件  
  276.         jlayer.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK  
  277.                 | AWTEvent.MOUSE_MOTION_EVENT_MASK);  
  278.     }  
  279.  
  280.     public void uninstallUI(JComponent c) {  
  281.         JLayer jlayer = (JLayer) c;  
  282.         jlayer.setLayerEventMask(0);  
  283.         super.uninstallUI(c);  
  284.     }  
  285.  
  286.     // JLayer對象專用的鼠標(biāo)事件,在installUI中啟動事件,在uninstallUI中禁用事件  
  287.     protected void processMouseEvent(MouseEvent e, JLayer l) {  
  288.         if (e.getID() == MouseEvent.MOUSE_ENTERED)  
  289.             mActive = true;  
  290.         if (e.getID() == MouseEvent.MOUSE_EXITED)  
  291.             mActive = false;  
  292.         l.repaint();  
  293.     }  
  294.  
  295.     // JLayer對象專用的鼠標(biāo)移動事件,在installUI中啟動事件,在uninstallUI中禁用事件  
  296.     // 這里把鼠標(biāo)坐標(biāo)記錄在mX和mY中  
  297.     protected void processMouseMotionEvent(MouseEvent e, JLayer l) {  
  298.         // 確定鼠標(biāo)移動事件相對于層的坐標(biāo)位置。  
  299.         Point p = SwingUtilities  
  300.                 .convertPoint(e.getComponent(), e.getPoint(), l);  
  301.         mX = p.x;  
  302.         mY = p.y;  
  303.         l.repaint();  
  304.     }  
  305.  
  306.     public void actionPerformed(ActionEvent e) {  
  307.         if (mIsRunning) {  
  308.             //firePropertyChange():通知的內(nèi)部狀態(tài)的更新  
  309.             firePropertyChange("tick"01);  
  310.             mAngle += 3;  
  311.             if (mAngle >= 360) {  
  312.                 mAngle = 0;  
  313.             }  
  314.             if (mIsFadingOut) {  
  315.                 if (--mFadeCount == 0) {  
  316.                     mIsRunning = false;  
  317.                     mTimer.stop();  
  318.                 }  
  319.             //防止AlphaComposite.getInstance()的第二個參數(shù)的值超出范圍  
  320.             } else if (mFadeCount < mFadeLimit) {  
  321.                 mFadeCount++;  
  322.             }  
  323.         }  
  324.     }  
  325.  
  326.     public void start() {  
  327.         if (mIsRunning) {  
  328.             return;  
  329.         }  
  330.         mIsRunning = true;  
  331.         mIsFadingOut = false;  
  332.         mFadeCount = 0;  
  333.         int fps = 24;  
  334.         int tick = 1000 / fps;  
  335.         //每tick毫秒調(diào)用一次本類中的actionPerformed方法  
  336.         mTimer = new Timer(tick, this);  
  337.         mTimer.start();  
  338.     }  
  339.  
  340.     public void stop() {  
  341.         mIsFadingOut = true;  
  342.     }  
  343.     //不斷repaint()窗口  
  344.     public void applyPropertyChange(PropertyChangeEvent pce, JLayer l) {  
  345.         if ("tick".equals(pce.getPropertyName())) {  
  346.             l.repaint();  
  347.         }  
  348.     }  

原文鏈接:http://blog.csdn.net/cannel_2020/article/details/7350516

【編輯推薦】

  1. 關(guān)于Java中內(nèi)存溢出的解決辦法
  2. Java中的面向?qū)ο筇匦?/a>
  3. 探究Java初始化的過程
  4. Java集合框架的知識總結(jié)
  5. Java與F#的并行程序處理對比
責(zé)任編輯:林師授 來源: Cannel_2020的博客
相關(guān)推薦

2010-06-28 09:26:15

JDK 7Swing組件Java

2022-09-07 10:20:05

Python裝飾類

2009-04-09 08:59:33

Windows 7微軟操作系統(tǒng)

2018-08-20 16:25:48

編程語言Java異常處理

2020-04-13 16:05:25

JS裝飾器前端

2011-07-29 09:43:52

Java SE 7

2009-07-14 17:21:42

Swing組件

2009-07-15 11:02:32

Swing組件

2009-07-10 16:29:32

Swing組件

2011-03-24 09:34:41

SPRING

2011-12-14 15:53:51

云計算

2011-12-07 10:46:25

Java

2009-07-10 09:38:06

Java swing組

2011-04-01 09:49:54

Python

2009-07-10 10:19:57

JFormattedTSwing

2010-06-10 09:26:22

Java 7

2015-03-10 11:21:44

JavaScript組JavaScript

2009-07-10 13:20:37

Swing容器組件

2009-10-20 14:10:00

CCIE經(jīng)驗

2014-07-02 10:03:42

App推廣渠道
點贊
收藏

51CTO技術(shù)棧公眾號