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


          常用鏈接

          留言簿(4)

          隨筆檔案

          相冊(cè)

          我的兄弟們

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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


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

          好了,現(xiàn)在很明確要做的事情了
          1. 加入鼠標(biāo)事件監(jiān)聽器,監(jiān)聽MouseEnter和MouseExit事件,根據(jù)這個(gè)兩個(gè)事件設(shè)置不同的背景色和邊框
          2. 做一個(gè)能夠顯示毛玻璃效果的邊框

          以下是邊框的代碼和部分MyJTextField的代碼,完整的代碼待我會(huì)打包傳上來的
          MyJTextField.java
          在初始化組件的時(shí)候加上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();
                      }
                  });
          以及屏蔽功能性按鈕和發(fā)出聲音提示的代碼:
          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 

          然后來欣賞我們的結(jié)果吧:

          鼠標(biāo)放上去之前


          鼠標(biāo)放上去之后

          我們輸入了不是數(shù)字的字符

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

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

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

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

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


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

          如果這個(gè)textField在多層panel里面的話,這樣計(jì)算就不對(duì).  所以你的location應(yīng)該是textfield相對(duì)于layeredPane的XY才對(duì)

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

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宜昌市| 台江县| 景洪市| 山东| 尼勒克县| 江源县| 镇平县| 繁峙县| 华容县| 镇沅| 城市| 图们市| 新津县| 临沧市| 永靖县| 犍为县| 绵竹市| 湛江市| 灵璧县| 繁峙县| 绥德县| 固始县| 宜君县| 安乡县| 西乌珠穆沁旗| 大余县| 屏东县| 长葛市| 虹口区| 故城县| 钦州市| 高碑店市| 武鸣县| 丰宁| 固阳县| 泗水县| 肇庆市| 资中县| 平乐县| 沙坪坝区| 沐川县|