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

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

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

    隨筆 - 18  文章 - 96  trackbacks - 0
    <2007年9月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456


    常用鏈接

    留言簿(4)

    隨筆檔案

    相冊

    我的兄弟們

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    昨天我們給JTextField增加了一個泡泡提示窗口,今天我們繼續昨天的,首先處理在顯示泡泡的時候忽略輸入的Backspace、Enter、Delete、Esc按鍵,然后加上錯誤的時候的聲音提示,最后再給JTextField換裝備,讓它看起來像MSN 8.5beta的輸入框,還是先放上圖片:


    這幅圖是MSN的輸入框,輸入框的內部到光標有一部分是有點毛玻璃的感覺,不過這個style是死的,我們改進一下,我們的JTextField在輸入之前是看似普通的,在鼠標放上去之后,看起來就與MSN的輸入框類似了,而且我們還給這個輸入框加入一個淡黃色的背景。

    好了,現在很明確要做的事情了
    1. 加入鼠標事件監聽器,監聽MouseEnter和MouseExit事件,根據這個兩個事件設置不同的背景色和邊框
    2. 做一個能夠顯示毛玻璃效果的邊框

    以下是邊框的代碼和部分MyJTextField的代碼,完整的代碼待我會打包傳上來的
    MyJTextField.java
    在初始化組件的時候加上Border的初始化:
            hoverBorder = new CoolBorder(HOVER_BORDER_COLOR, 3);
            border 
    = BorderFactory.createCompoundBorder(new LineBorder(
                    BORDER_COLOR, 
    1), new EmptyBorder(new Insets(2222)));

            setBackground(BACKGROUND_COLOR);
            setBorder(border);
    和事件的初始化:
            addMouseListener(new MouseAdapter() {
                @Override
                
    public void mouseEntered(MouseEvent e) {
                    setBorder(hoverBorder);
                    setBackground(HOVER_BACKGROUND_COLOR);
                    repaint();
                }

                @Override
                
    public void mouseExited(MouseEvent e) {
                    setBorder(border);
                    setBackground(BACKGROUND_COLOR);
                    repaint();
                }
            });
    以及屏蔽功能性按鈕和發出聲音提示的代碼:
    addKeyListener(new KeyAdapter() {
                @Override
                
    public void keyTyped(KeyEvent e) {
                    
    char input = e.getKeyChar();
                    
    // ESC27 ,Backspace 8 ,Enter 10, Del 127, must ignore
                    boolean ignoreInput = input == (char) KeyEvent.VK_ESCAPE
                            
    || input == (char) KeyEvent.VK_BACK_SPACE
                            
    || input == (char) KeyEvent.VK_ENTER
                            
    || input == (char) KeyEvent.VK_DELETE;
                    
    if (ignoreInput) {
                        limitTip.setVisible(
    false);
                        numberTip.setVisible(
    false);
                        
    return;
                    }
                    
    if (getText().length() + 1 > limit) {
                        Toolkit.getDefaultToolkit().beep();
                        deleteInputChar(e);
                        limitTip.setVisible(
    true);
                        
    return;
                    } 
    else {
                        limitTip.setVisible(
    false);
                    }
                    
    if (numberOnly) {
                        
    if (!Character.isDigit(input)) {
                            numberTip.setVisible(
    true);
                            Toolkit.getDefaultToolkit().beep();
                            deleteInputChar(e);
                        } 
    else {
                            numberTip.setVisible(
    false);
                        }
                    }
                }

                
    private void deleteInputChar(KeyEvent source) {
                    source.setKeyChar((
    char) KeyEvent.VK_CLEAR);
                }
            });


    下面是Border的完整代碼:
     1 /**
     2  * @(#)CoolBorder.java  0.1.2  2007-9-10
     3  */
     4 package ruislan;
     5 
     6 import java.awt.Color;
     7 import java.awt.Component;
     8 import java.awt.Dimension;
     9 import java.awt.GradientPaint;
    10 import java.awt.Graphics;
    11 import java.awt.Graphics2D;
    12 import java.awt.Insets;
    13 
    14 import javax.swing.border.Border;
    15 
    16 /**
    17  * Custom Border.
    18  * 
    19  * @version 0.1.2, 2007-9-10
    20  * @author ruislan <a href="mailto:z17520@126.com"/>
    21  */
    22 public class CoolBorder implements Border {
    23     private int thickness;
    24     private Insets insets;
    25     private Dimension lastComponentSize;
    26     private Color color;
    27     private Color color2;
    28 
    29     public CoolBorder(Color color, int thickness) {
    30         this.color = color;
    31         if (color == null) {
    32             this.color = color = Color.gray;
    33         }
    34         color2 = new Color(2102102100);
    35         this.thickness = thickness;
    36     }
    37 
    38     @Override
    39     public Insets getBorderInsets(Component c) {
    40         Dimension currentComponent = c.getSize();
    41 
    42         if (currentComponent.equals(lastComponentSize)) {
    43             return insets;
    44         }
    45 
    46         insets = new Insets(thickness, thickness, thickness, thickness);
    47         lastComponentSize = currentComponent;
    48         return insets;
    49     }
    50 
    51     @Override
    52     public boolean isBorderOpaque() {
    53         return true;
    54     }
    55 
    56     @Override
    57     public void paintBorder(Component c, Graphics g, int x, int y, int width,
    58             int height) {
    59         Graphics2D g2d = (Graphics2D) g.create();
    60         // 畫上邊緣
    61         GradientPaint gp = new GradientPaint(x, y, color, x, y + thickness,
    62                 color2);
    63         g2d.setPaint(gp);
    64         g2d.fillRect(x, y, width, thickness);
    65         // 畫下邊緣
    66         gp = new GradientPaint(x, y + height - thickness - 1, color2, x, y
    67                 + height, color);
    68         g2d.setPaint(gp);
    69         g2d.fillRect(x, y + height - thickness - 1, width, thickness);
    70         // 畫左邊緣
    71         gp = new GradientPaint(x, y, color, x + thickness, y, color2);
    72         g2d.setPaint(gp);
    73         g2d.fillRect(x, y, thickness, height);
    74         // 畫右邊緣
    75         gp = new GradientPaint(x + width - thickness - 1, y, color2, x + width,
    76                 y, color);
    77         g2d.setPaint(gp);
    78         g2d.fillRect(x + width - thickness - 1, y, thickness, height);
    79         // 畫外框
    80         g2d.setPaint(color);
    81         g2d.drawRect(x, y, width - 1, height - 1);
    82         g2d.dispose();
    83     }
    84 
    85 }
    86 

    然后來欣賞我們的結果吧:

    鼠標放上去之前


    鼠標放上去之后

    我們輸入了不是數字的字符

    至此,我們的JTextField又向前走了一步,下次我們還能如何改進呢?把JTextField這個死板的長方形改造成云狀的或者其他形狀的?

    附源代碼下載地址:http://www.tkk7.com/Files/ruislan/myjtextfield.zip

    posted on 2007-09-10 13:21 ruislan 閱讀(4347) 評論(3)  編輯  收藏

    FeedBack:
    # re: 帶提示的JTextField之二 2007-12-18 20:52 zhouyishen@gxlu.com.cn
    你好!!
       我在網上看到你這個textField的例子真的好震撼哦....崇拜一把

    不過還是有點小問題, 你給textField定位的時候, 
    private void determineAndSetLocation() {
    Point location = attachedComponent.getLocation();
    setBounds(location .x, location .y - getPreferredSize().height,
    getPreferredSize().width, getPreferredSize().height);
    }


    但是目前您的這個XY只是textField相對于他父panel的XY,但是你要show在layeredPane.

    如果這個textField在多層panel里面的話,這樣計算就不對.  所以你的location應該是textfield相對于layeredPane的XY才對

    所以這里我想改一下 但是我不知道如何得到textField相對于layeredPane的X和Y呢?
    我只想到一個相當笨的方法, 不斷getParent()后在把所以XY相加, 不知道還有其他方法嗎?

    謝謝  回復  更多評論
      
    # re: 帶提示的JTextField之二 2009-06-23 23:59 張晨光
    直接使用getLocationOnScreen()函數就行了……
    @zhouyishen@gxlu.com.cn
      回復  更多評論
      
    # re: 帶提示的JTextField之二 2012-09-11 10:34 kara
    沒有源碼包啊。。只有jar  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 污污免费在线观看| 亚洲中文精品久久久久久不卡| 日韩在线观看视频免费| 四虎影视永久免费观看网址| 国产亚洲漂亮白嫩美女在线| 国产精品免费播放| 污视频网站免费观看| 精品国产亚洲男女在线线电影 | 国产在线19禁免费观看| 欧美亚洲精品一区二区| 可以免费观看一级毛片黄a| 日本一区二区在线免费观看 | 国产一区二区免费视频| 亚洲欧洲第一a在线观看| 99久久99久久精品免费看蜜桃 | 成人无码区免费视频观看| 亚洲精品女同中文字幕| 一区二区三区亚洲视频| 青青操视频在线免费观看| 亚洲国产精品人久久| 黄色成人网站免费无码av| 高潮毛片无遮挡高清免费视频| 免费无码又爽又黄又刺激网站 | 一区二区三区免费在线视频| 亚洲无人区一区二区三区| 在线观看www日本免费网站| 亚洲另类无码专区首页| 亚洲精品99久久久久中文字幕| 美女视频黄a视频全免费网站色窝| 亚洲乱码日产精品BD在线观看| 精品免费国产一区二区三区| 精品无码一级毛片免费视频观看| 久久久久亚洲AV无码专区体验| 成人毛片18女人毛片免费视频未| 四虎永久在线精品免费一区二区| 久久久久亚洲AV成人无码 | a级在线免费观看| 亚洲色大情网站www| 亚洲精品自在在线观看| 成人免费无遮挡无码黄漫视频| 国产高清对白在线观看免费91|